[路飞]_程序员必刷力扣题: 最长回文串

386 阅读2分钟

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

最长回文串

力扣链接

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

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

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

示例 1:

输入:
"abccccdd"

输出:
7

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

哈希表

思路

题目解析:

  • 偶数。回文串符合对称结构,除了最中间相同的字符串,两边都是对称的,那么数量一定是偶数,所以 所有的偶数都要统计进去
  • 奇数。中间这个数可以是一个('s')或者多个('sss'),这里需要注意的是'aaaaa'和'bbb'和'ccccc',都可统计进去,如'bccaaaaaccb',只要字符串大于2,我们就能利用截取其中一部分
  • 如果中间是偶数个,中间还能再夹一个其它任意1个的字符串

理清思路那么接下来就好做了

  • 计数统计。声明一个map表,开始遍历字符串,并在map表中统计所有不同字符串的数量
  • 遍历统计结果map表,所有数量为偶数的,直接算进最后结果res。数量为奇数的字母,我们要看他是否是1位,若1位则用odd来记录1;若是多位,则减去一位就是偶数了,所以统计map[key] - 1个字符,并且odd=1,用来放在回文字符串的最中间位置
  • 返回最后结果res(所有偶数)+odd(任意一位字母)
var longestPalindrome = function (s) {
    var map = {}
    for (var i = 0; i < s.length; i++) {
        map[s[i]] ? map[s[i]]++ : (map[s[i]] = 1)
    }
    var odd = 0;
    var res = 0
    for (var key in map) {
        if (map[key] % 2 === 0) {
            res += map[key]
        }
        if (map[key] % 2 === 1 && map[key] > 1) {
            res += map[key] - 1
            odd = 1
        }
        if (map[key] === 1) {
            odd = 1
        }
    }
    return res + odd
};