题目描述
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。
解题思路
有两种情况可以构成回文字符串:
1.全部字符呈偶数对出现
2.一组字符呈奇数对出现,其余的成偶数对出现。
我们既然已经明白最后会涉及到对字符串中的字符个数的奇偶性的判断,那么我们可以先利用一种映射关系将字符串中的每个字符个数统计下来
再回到本题目的具体需求:找出最大回文字符串的个数,此时我们将可以构成回文字符串的两种情况处理一下既可以得到我们该进行如下操作:
1.若判断某个字符个数是偶数则直接加上即可
2.若出现了奇数个的字符我们需要然一个奇数个数的字符保持奇数,其余的奇数个字符的奇数分别减去一,变为偶数个(解释可能不清楚,一会看代码)
其中我们发现上述中第二种情况较难处理(这也是官方答案技巧较强的一处)
我们利用*/的特性(结果为一个整数),在最后判断奇偶性时,我们设字符出现的个数为num那么num / 2 * 2得到的就确保为偶数,再将其加到一个统计个数的变量上,此时我们利用一个条件判断若有一个字符的个数为奇数同时统计个数变量为偶数我们则将统计个数的变量加一*这样我们其实就保证了构成最大回文字符串中只能有一组奇数个数的字符(若解释还比较模糊,看代码!!!)。
代码
class Solution {
//Time Complexity: O(N)
//Space Complexity: O(1)
public int longestPalindrome(String s) {
int res = 0;
int[] count = new int[128];
//利用映射关系统计字符个数
for (int i = 0; i < s.length(); i++) {
int ch = s.charAt(i);
count[ch]++;
}
//判断奇偶性
for (int num : count) {
res += num / 2 * 2;
//保证只存在一组奇数个数的字符
if (num % 2 == 1 && res % 2 == 0) {
res++;
}
}
return res;
}
}