409. 最长回文串

在这里插入图片描述
也是挺巧妙的题目,我以为是找s的最长回文串,没想到是把s组成最大的回文串。
不看答案我想不出,毕竟最近有点笨,哈希表记录每个字符的出现次数。因为是回文串,所以有aba和abba这两种,出现次数是偶数次的一定可以全部拿来贡献回文串,奇数次的-1可以用来贡献。而且因为有aba这种,所以如果有出现奇数次的,最后最大长度还得要加上1

class Solution {
public:
    int longestPalindrome(string s) {
        //用哈希记录每个字符出现的次数
        //因为组成回文子串的情况是两种bab这种中间一个字符的,或者baab这种中间两个字符的
        //我们把maxlen加上偶数字符出现了几次,然后再考虑奇数字符,因为奇数字符-1后也是偶数字符,所以我们再加上每个奇数字符-1后的出现次数。如果有奇数字符出现的话,最后长度加上1,因为bab这种
        unordered_map<char,int> ma;
        for(char c: s){
            ma[c]++;
        }
        int maxLen = 0;
        bool flag = false;
        //这个it不是迭代器,这个it是一个pairs,所以用.而不是->
        for(auto it : ma){
            if(it.second % 2 == 0){
                maxLen += it.second;
            }
            else{
                maxLen += it.second-1;
                flag = true;
            }
        }
        return flag ? maxLen+1:maxLen;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值