LeetCode 409. Longest Palindrome

本文介绍了一种求解给定字符串中最长回文新串长度的方法,通过遍历字符并利用标记数组来记录每种字符出现的情况,最终计算出最长回文长度。

题目

给一个大小写组成的字符串s,利用s中的字母,能组成的最长回文新串的长度。
注意:大小写敏感,”Aa” 不是回文
例子:
s = “abccccdd”,其中字母可组成最长回文新串 “dccaccd”,长度为7

思路

回文的特点是左右字母对称,即由一对对的字母组成,中间可能包含一个单一不成对的字母。

扫描原串,利用列表isExist[26*2]记录字母是否出现过,当一个字母出现过两次时即该对字母可组成回文串一部分,把表中该字母出现过的标记清空;若还没出现过则在表中该字母对应位置打上标记。

最后回文长度 = 对数 * 2 + 1(若还存在单独的字母)

代码

class Solution {
public:
    int longestPalindrome(string s) {

        // A...Za...z
        bool isExist[26*2] = {false};

        // has_Single 记录表中为 true 的个数,即单独的字母的个数
        int pairs = 0, has_Single = 0;

        for (int i = 0; i < s.length(); i++) {

            int index = s[i] >= 'a'? s[i] - 'a' + 26: s[i] - 'A';

            if (isExist[index]) {

                has_Single--;

                pairs++;

                isExist[index] = false;

            } else {

                has_Single++;

                isExist[index] = true;

            }
        }

        return pairs * 2 + (has_Single > 0? 1 : 0);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值