1、题目描述
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
输入示例:
输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
2、算法分析
回文字符串,简单的说是对称的字符串,就是正着读和反着读都是一样的字符串。
要想获取最长的回文子串,需要有足够多的偶数对应的字符。比如
在字符串 "abba" 中,回文中心是 "ab|ba" 中竖线的位置,而在字符串 "abcba" 中,回文中心是 "ab(c)ba" 中的字符 "c" 本身。我们可以发现,在一个回文串中,只有最多一个字符出现了奇数次,其余的字符都出现偶数次。将每个字符使用偶数次,使得它们根据回文中心对称。在这之后,如果有剩余的字符,我们可以再取出一个,作为回文中心。
具体:
首先创建一个大小为128的数组,数组类型为int,因为字符串中存在大小写字母。
接着对这些大小写字母计数。
①获取偶数次的字符:cnt / 2 *2;不必担心cnt = 1的情况 1/2 = 0 0*2 = 0
②计数,遍历s字符串,然后计数
③遍历计数数组,然后计数偶数个字符。注意,当结果数为偶数的时候,且cnt=1的时候,也就是字符串中间的位置。计数加1
具体看代码。
3、代码实现
class Solution {
public int longestPalindrome(String s) {
//计数
int[] count = new int[128];
for(int i = 0;i < s.length();i++){
char c = s.charAt(i);
count[c]++;
}
int result = 0;
for(int cnt : count){
// 获取偶数的字符
result += cnt / 2 * 2;
// 中间值 +1
if(cnt % 2 == 1 && result %2 == 0){
result++;
}
}
return result;
}
}