我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
题目
-
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
-
在构造过程中,请注意区分大小写。比如
"Aa"不能当做一个回文字符串。
思路
1、首先声明一个长度为52的数组,初始化值为0,然后我们将遍历字符串将每个字母出现的次数记录到数组里,字母的ascii码相对位置为索引,比如小写字母b的相对位置是 b.codePointAt() - 97, 而大写字母 B的相对位置是
B.codePointAt() - 65 + 26
2、标记是否有单数oddMark, 如果有单数最终结果res 减一,打个比方,如果一个字母出现的个数是5,那么他是个单数, oddMark标记为1, 还有4个偶数长度可以全部计入长度。 单数的我们只需要记录一次就好了。我们将 res + oddMark作为最终结果。
代码如下
var longestPalindrome = function(s) {
const table = new Array(52).fill(0) // 声明一个可以装大写小写字母的
for(let i= 0; i< s.length; i++){
if(s[i] >= 'a' && s[i] <='z'){
// 判断是否为小写字母
table[s.codePointAt(i) - 97] ++
}else{
table[s.codePointAt(i) - 65 + 26] ++
}
}
let res =0, oddMark = 0
for(let i =0; i< 52;i++){
res += table[i] // 遍历每个字母计数
if(table[i] % 2){
res -- // 有单数时候总数减一
oddMark = 1 // 标记有单数
}
}
return res+ oddMark // 返回最终结果
}
结束语
关于回文串的题目有很多很多,之前也写过一篇回文子串的个数,掌握了什么是回文,根据回文的特点来构建自己的思路,这样就能够很快解决掉题目了。leetcode上的回文串题,还有很多很多等我们去解答。好了大家加油~
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~
回文串相关文章:leetcode647统计回文串个数