JS最长回文串

191 阅读1分钟

网图封面(狗头)

正题

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

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

注意:

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

示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

分析:

要组成回文必包涵以下几个条件:

1.相同字符个数必须是大于2的偶数

2.奇数个字符串只能出现一个(在最中间的位置)

3.已经用过的字符不能再重复使用

核心思路:优先考虑偶数回文,即每个字符必出现偶数次,然后再除去已使用过的字符,剩下的如果有没有使用过的,那么任意一个都可以放在回文中间位置,即回文长度 + 1即可

解法1:数组缓存法

ScreenRecorderProject9.gif

/**
 * @param {string} s
 * @return {number}
 */
var longestPalindrome = function(s) {
    let res = []
    let count = 0
    s = s.split('')
    s.forEach(n => {
        if (res.indexOf(n) === -1) {
            res.push(n)
        } else {
            res.splice(res.indexOf(n), 1)
            count+= 2
        }
    })
    count = res.length  ? count + 1 : count

    return count
};

解法2:哈希计数法

ScreenRecorderProject10.gif

var longestPalindrome = function(s) {
    let  = 0
    s = s.split('')
    let map = {}
    s.forEach(n => {
       if (map[n]) {
           map[n] = map[n] + 1
       } else {
           map[n] = 1
       }
    })
    let min = 0
    Object.keys(map).forEach((key) => {
        const number = map[key]
        if (number % 2 !== 0) {
            min++
        } 
    })
    return min > 0 ? s.length - min + 1 : s.length - min
  };