题目: 给定一个包含大写字母和小写字母的字符串
s,返回 通过这些字母构造成的 最长的回文串的长度 。 在构造过程中,请注意 区分大小写 。比如"Aa"不能当做一个回文字符串。
已知回文串是由字符串的内容 构造出来的,所以只要里面字母任意调换位置后可以成为一个回文串,那么就返回最长的那个回文串长度.
思路:
1、能组成回文串内容的 字符的长度必须是2的倍数, 例如2个a或者4个a。
伪代码:遍历s然后记录长度为偶数的字符
2、考虑回文串长度可能是奇数,则中间还有一个任意字符。
伪代码:遍历后查看是否存在一次的字符,是则 length+1 否则 length;
3、根据前两点,我们需要遍历过程中能记录偶数长度,又能记录是否奇数字符
伪代码:遍历过程中遇到偶数的记录长度后删除对应字符,最终只保留单独的字符,用于判断是否第二步。
var longestPalindorme = function(s){
let length = 0;
let str = ''; //用于记录字符
for(let i = 0; i<s.length; i++){
if(str.includes(s[i])){ //判断出现次数
length+=2; //累计回文串长度
str = str.replace(s[i],'');//删除对应的字符
}else{
str = str + s[i] //未出现过则新增
}
}
return str.length ? length + 1 : length; //考虑回文串长度为奇数的情况.
}
后来看力扣题解的时候,发现还有更简洁的方法,就是将记录字符串 str换成 Set,判断是否存在用Set.has(),删除用Set.delete(),添加用Set.add()。
之前不习惯写文章记录,后面越发觉得好记性不如烂笔头,并且记录过程中也能巩固记忆与知识点。
第一次尝试着记录这些思路,所以可能有点啰嗦,望读者谅解.