每日一算法-最长回文串

今日分享一个最长回文串的算法,中等难度,只要想到方法,很容易就能写出一种算法。废话不多说,开搞。

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

题目解析

回文串:每种字符都出现了偶数次,最多有一个奇数在中间,回文串是指正序(从左向右)和倒序(从右向左)读都是一样的字符串。

上代码

public static int longestPalindrome(String s) {

        int[] cnt = new int[128];
        for (char c : s.toCharArray()) {
            cnt[c] += 1;
        }

        int ans = 0;
        for (int x : cnt) {
            // 字符出现的次数最多用偶数次。
            ans += x / 2;
        }
        // 最终的长度小于原字符串的长度,说明里面某个字符出现了奇数次,可以放在回文串的中间,长度加1。
        return ans * 2 < s.length() ? (ans * 2) + 1 : (ans * 2);
    }

私货时间

看透了主要点,立马解法就出来了。让我们一起来。

猜你喜欢

转载自www.cnblogs.com/liutian1912/p/12527681.html