「这是我参与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
};