[路飞]-leetcode 409最长回文串

246 阅读2分钟

我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

题目

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

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

思路

1、首先声明一个长度为52的数组,初始化值为0,然后我们将遍历字符串将每个字母出现的次数记录到数组里,字母的ascii码相对位置为索引,比如小写字母b的相对位置是 b.codePointAt() - 97, 而大写字母 B的相对位置是 B.codePointAt() - 65 + 26

2、标记是否有单数oddMark, 如果有单数最终结果res 减一,打个比方,如果一个字母出现的个数是5,那么他是个单数, oddMark标记为1, 还有4个偶数长度可以全部计入长度。 单数的我们只需要记录一次就好了。我们将 res + oddMark作为最终结果。

代码如下


var longestPalindrome = function(s) {
    const table = new Array(52).fill(0) // 声明一个可以装大写小写字母的
    for(let i= 0; i< s.length; i++){
        if(s[i] >= 'a' && s[i] <='z'){
            // 判断是否为小写字母
            table[s.codePointAt(i) - 97] ++
        }else{
            table[s.codePointAt(i) - 65 + 26] ++
        }
    }
    let res =0, oddMark = 0
    for(let i =0; i< 52;i++){
        res += table[i] // 遍历每个字母计数
        if(table[i] % 2){
            res -- // 有单数时候总数减一
            oddMark = 1 // 标记有单数
        }
    }
    return res+ oddMark // 返回最终结果
}

结束语

关于回文串的题目有很多很多,之前也写过一篇回文子串的个数,掌握了什么是回文,根据回文的特点来构建自己的思路,这样就能够很快解决掉题目了。leetcode上的回文串题,还有很多很多等我们去解答。好了大家加油~

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~

回文串相关文章:leetcode647统计回文串个数