给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
每日打卡,注意坑的几个点:
- 如果某字母有偶数个,因为偶数有对称性,可以把它全部用来构造回文串;
- 但如果是奇数个的话,不是无法构建,也不是只能选最长的,而是只要砍掉1个,剩下的变成偶数就可以全部计入了。
- 但奇数字母里,可以保留1个不砍,把它作为回文串的中心,所以在有奇数的前提下,最后还是要再加回一个1。
- 如果压根没有奇数的情况,这个1就不能加。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
class Solution {
public:
int longestPalindrome(string s) {
int sum = 0;
bool HaveOdd = false;
for (char c : s) {
if (m_count.count(c) == 0) {
m_count[c] = 1;
}
else {
m_count[c]++;
}
}
unordered_map<char, int>::iterator it = m_count.begin();
while (it != m_count.end()) {
if (it->second % 2 == 0) {
sum += it->second;
}
else {
HaveOdd = true;
sum += (it->second - 1);
}
it++;
}
if (HaveOdd) {
sum += 1;
}
return sum;
}
private:
unordered_map<char, int> m_count;
};