题目:最长回文串

思路:对于出现次数为偶数个的字符,可以直接将其添加至回文字符串两端;对于出现次数为奇数个的字符,最多取其中的 (ct - 1)个添加至两端,最后还可以从奇数字符中拿出一个放在最中间

longestPalindrome()

 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}

来源:语雀原笔记