1、题目:409. 最长回文串 - 力扣(LeetCode) (leetcode-cn.com)
2、实现
(1)总体思路:
- 将字符串中所有的字母的个数,以键值对的方式记录下来,可以用Map对象也可以用{}对象;
- 遍历这个键值对对象,然后判断每个字母的个数,如果是偶数,就直接计数;如果是奇数,那要先减去1,将奇数变为偶数进行计数。
- 回文串的中间可以有一个单独的字母作为中心,所以在对偶数累计计数结束后,可以再加1,作为最后的长度。
(2)用Map对象实现,代码如下:
/**
* @param {string} s
* @return {number}
*/
var longestPalindrome = function(s) {
let map = new Map();
// 统计字符串中各字母的个数
for(let i=0; i<s.length; i++) {
map.set(s[i], map.has(s[i]) ? map.get(s[i])+1 : 1);
}
// 遍历map
let num = 0, center = 0;
for(let [key,value] of map) {
if(value % 2 === 0) {
// 为偶数
num += value;
} else {
// 为奇数(将数字减1就是偶数啦)
num += value - 1;
center = 1;
}
}
return num + center;
};
(3)用普通对象实现,代码如下:
/**
* @param {string} s
* @return {number}
*/
var longestPalindrome = function(s) {
const obj = {};
for(let i=0; i<s.length; i++) {
if(obj[s.charAt(i)]) {
obj[s.charAt(i)] += 1;
} else {
obj[s.charAt(i)] = 1;
}
}
let num = 0;
for(let key in obj) {
if(obj[key] % 2 === 0) {
num += obj[key];
} else {
num += obj[key] - 1;
}
}
return s.length >= num + 1 ? num+1 : num;
};
3、参考:
滚滚在leetcode刷题-409-最长回文串_哔哩哔哩_bilibili
每日一题ep19: ∞ longestPalindrome 最长回文字符串 (JavaScript/js) - 最长回文串 - 力扣(LeetCode) (leetcode-cn.com)