1. 题目
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
2. 思路
- 用HashMap记录每个字符出现的次数
- 如果某字母有偶数个,因为偶数有对称性,可以把它全部用来构造回文串;但如果是奇数个的话,并不是完全不可以用来构建,也不是只能选最长的那个,而是只要砍掉1个,剩下的变成偶数就可以全部计入了。也就是假设它出现了 v 次,我们可以使用该字符 v / 2 * 2 次
- 如果有任何一个字符 ch 的出现次数 v 为奇数(即 v % 2 == 1),那么可以将这个字符作为回文中心,注意只能最多有一个字符作为回文中心。
3. 知识点
HashMap中所有value的集合表示为:
Collection<Integer> values = map.values();
4.代码
class Solution {
public int longestPalindrome(String s) {
char[] array = s.toCharArray();
//HashMap存储每个字符出现的次数
HashMap<Character, Integer> map = new HashMap<>();
for(char ch: array) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
int res = 0;
Collection<Integer> values = map.values();
for(int v: values){
res += v/2*2;//所有出现次数>=2的数取偶数累加
if(v % 2 == 1 && res % 2 == 0){//如果res还是偶数次,则可以+1,如果res已经是奇数次了,则不再+1,达到只加一次的目的
res++;
}
}
return res;
}
}