今日分享一个最长回文串的算法,中等难度,只要想到方法,很容易就能写出一种算法。废话不多说,开搞。
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “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);
}
私货时间
看透了主要点,立马解法就出来了。让我们一起来。