题目描述

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

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

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

示例 1:

输入:
"abccccdd"

输出:
7

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

解题思路

我们可以看出来,最长回文串两侧出现的次数需要被2整除,如果有一个单一项,可以将其加到中间。

思路就是:

  • 先将字符串转化为数组,并遍历数组,统计每个元素的个数,储存在map中
  • 遍历map,获取能被2整除的元素个数
  • 如果有单一的元素,就取一个,如果没有就不取

代码实现

/**
* @param {string} s
* @return {number}
*/
var longestPalindrome = function(s) {
let arr = s.split('')
let map = {} // map用来储存元素及其数量
// 获取每个元素的个数
for(let i = 0;i < arr.length; i++){
map[arr[i]] = map[arr[i]] ? map[arr[i]]+1:1
}
let res = 0
// 遍历map
for(let item in map){
// 如果元素的个数大于2,就取其中是2的倍数的部分
if(map[item] >= 2){
res += Math.floor(map[item]/2)*2
}
// 如果有单一的元素,就取一个,只取一次。如果res%2不是0,说明已经加了一次,就不在加了
if(map[item]%2 === 1 && res%2 === 0){
res++
}
}
return res
};

提交结果

【LeetCode 409】最长回文串_字符串