leetcode 409 最长回文串(字符哈希)

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
回文字符串,从前向后遍历和从后向前遍历都是相同的
问题思考:
例如在s = "abccccddaa"中,有3个a,1个b,4个c,2个d
使用字符串s中的字符,任意组合,生成新的字符串,若生成的字符串为回文字符串,需要除了中心字符,其余字符只要头部出现,尾部就要出现
在字符串中,字符数量为偶数的字符,或为奇数的字符如何进行处理
1、在字符串中,字符数量为偶数的字符:
全部使用,头部放一个字符,尾部就对应放一个
2、在字符串中,字符数量为奇数的字符:
丢掉一个字符,剩下的字符数为偶数个,按照字符数量为偶数的字符进行处理
3、若有剩余的字符,随便选择一个字符当做中心字符
算法思路:
1、利用字符哈希方法,统计字符串中所有的字符数量
2、设置最长回文串偶数字符长度为max_length = 0;
3、设置是否有中心点标记flag = 0;
4、遍历每一个字符,字符数为count,若count为偶数,max_length+=count;若count为奇数,max_length += count - 1, flag = 1;
5、最终最长回文子串长度:max_length + flag
例如在s = "abccccddaa"中,有3个a,1个b,4个c,2个d
1、3个a,max_length += 2;flag = 1;如生成aa
2、1个b,max_length += 0;忽略b
3、4个c,max_length += 2;如生成ccaacc
4、2个d,max_length += 2;如生成dccaaccd
flag = 1;
故可生成如:dccaaaccd、dccabaccd
最终长度:max_length + flag = 8 + 1 = 9
代码如下:

class Solution {
public:
    int longestPalindrome(string s) {
        int char_map[128] = {0};    //字符哈希
        int max_length = 0;
        int flag = 0;
        for (int i = 0; i < s.length(); i++){
            char_map[s[i]]++;
        }
        for (int i = 0; i < 128; i++){
            if (char_map[i] % 2 == 0){
                max_length += char_map[i];
            }
            else{
                max_length += char_map[i] - 1;
                flag = 1;
            }
        }
        return max_length + flag;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值