题目:最长回文串
思路:对于出现次数为偶数个的字符,可以直接将其添加至回文字符串两端;对于出现次数为奇数个的字符,最多取其中的 (ct - 1)个添加至两端,最后还可以从奇数字符中拿出一个放在最中间
1int longestPalindrome(string s)
2{
3 if(s.size() <= 1) return s.size();
4
5 // 统计字符出现次数
6 std::unordered_map<char, int> um;
7 for(char c : s)
8 {
9 um[c]++;
10 }
11
12 int length = 0;
13 bool has_odd = false;
14 for(const auto& [ch, cnt] : um)
15 {
16 // 利用 int 的向下取整性质
17 // 可以将奇偶的情况统一处理
18 length += (cnt / 2) * 2;
19 // 判断是否存在奇数出现次数
20 if(cnt % 2 == 1)
21 {
22 has_odd = true;
23 }
24 }
25 // 如果 s 中含有奇数出现次数的字符
26 // 就在中间再加上这个字符(长度加一)
27 return length + (has_odd ? 1 : 0);
28}
来源:语雀原笔记