网图封面(狗头)
正题
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
分析:
要组成回文必包涵以下几个条件:
1.相同字符个数必须是大于2的偶数
2.奇数个字符串只能出现一个(在最中间的位置)
3.已经用过的字符不能再重复使用
核心思路:优先考虑偶数回文,即每个字符必出现偶数次,然后再除去已使用过的字符,剩下的如果有没有使用过的,那么任意一个都可以放在回文中间位置,即回文长度 + 1即可
解法1:数组缓存法
/**
* @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:哈希计数法
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
};