这题其实是数学题。思路就是遍历所有字符,记下其个数。然后某个字符如果是偶数个的话一定会全部放到回文串中,如果是奇数的话,可以减去一个放到回文串中。
注意:
1) 最长的那个奇数字符串可以放到中间,所以最后当奇数字符存在时sumLen要+1。
2) 若奇数字符不存在sumLen则不动。注意”aaaa”的case。
int longestPalindrome(string &s) {
if (s.size()==0) return 0;
int sumLen=0;
int oddNum=0;
unordered_map<char, int> hashmap;
for (int i=0; i<s.size(); ++i) {
if (hashmap.find(s[i])!=hashmap.end()) {
hashmap[s[i]]++;
} else {
hashmap[s[i]]=1;
}
}
for (auto h : hashmap) {
if (h.second & 0x1) {
oddNum++;
sumLen += h.second-1;
}
if (!(h.second & 0x1)) {
sumLen += h.second;
}
}
return oddNum? sumLen+1 : sumLen;
}