409. 最长回文串(简单)
方法:哈希表 + 贪心
思路
- 不难发现,回文字符串一定是由 若干偶数个字符 + 至多一个奇数个字符 组成 。
- 我们可以使用一个长度为 128 的 hash表来记录每一个字符的出现次数,当该字符出现了两次,它一定能作为最大长度的回文子串的一部分,因此将 ans += 2,并将其赋值为 0。
- 在完成对 s 的遍历后,我们需要检查 hash表中是否还有次数为 1 的字符,它可以作为回文子串的中心,如果有的话,最大长度 + 1 。
代码
class Solution {
public:
int longestPalindrome(string s) {
vector<char> hashTable(128);
int ans = 0;
for(char ch : s) {
hashTable[ch]++;
// 该字符出现了两次,一定可以放在回文子串的两边
if(hashTable[ch] == 2) {
ans += 2;
hashTable[ch] = 0;
}
}
for(char h : hashTable) {
if(h == 1) {
ans += 1;
break;
}
}
return ans;
}
};