最长回文串

题目描述:
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

示例 1:
输入:
“abccccdd”

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

思路:我们用哈希表(映射都可以)记录下每个字符出现的次数。然后有以下几种情况:

  • 如果个数为偶数,因为偶数可以拆到两边,所以直接加上偶数个数即可。
  • 奇数,如果字符个数为奇数只有一个的话,我们将其放在中间即可。如果大于一个我们就将大的放中间,其余的减去一变成偶数放到两边即可。

代码:

int longestPalindrome(string s) {
        unordered_map<char,int>key;
        for(auto ch:s)
            key[ch]++;
        int count =0,cnt=0,mid=0;
        int ans = 0;
        for(auto it=key.begin();it!=key.end();++it)
        {
            if(it->second%2) //为奇数
                {
                    mid = max(mid,it->second); //记录最大值
                    count++; //个数
                    cnt +=it->second; 
                }
            if(it->second%2==0) //为偶数
                ans +=it->second;
        }
        if(count==0)
            return ans;
        else if(count==1)
            return ans+cnt;
        else
        {
            ans +=mid;
            cnt=cnt-mid-1*(count-1); //放到两边的是总的减去放到中间的,因//为每一个奇数都要减一,所以还要减去(count-1)
            return ans+cnt;
        }
    }

优化:我们发现如果是奇数的话只要加上其个数减去一即可。有因为在中间的可以不用减我们只要在后边特判加上一即可。

int longestPalindrome(string s) {
        map<char,int> count;
        for(char ch:s)count[ch]++;
        int res=0;
        for(auto it:count){
            if(it.second&1)res+=it.second-1;//加上奇数字符数-1
            else res+=it.second;//加上偶数字符数
        }
        return res<s.size()?res+1:res;//加上一个单字符放在中间
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值