[409]最长回文串
程序员文章站
2024-01-22 11:07:22
...
409.最长回文串
链接
题目描述
做法
1.自己的做法
遍历 s 中的每一个字符,对每一个字符放入到 map 中。
最后统计 map 中每个字符出现的次数
- 如果是偶数,结果直接加这个数
- 如果是奇数,结果加这个数减1,并且设置一个 boolean 类型变量记录是否出现了奇数
最后如果出现了奇数,那么最后结果要 +1 。
class Solution {
public int longestPalindrome(String s) {
if(s == null || s.length() == 0){
return 0;
}
int res = 0;
boolean single = false;
HashMap<Character,Integer> map = new HashMap<>();
for(Character c : s.toCharArray()){
if(!map.containsKey(c)){
map.put(c,1);
}else{
Integer temp = map.get(c);
temp++;
map.put(c,temp);
}
}
for(Character c : map.keySet()){
if(map.get(c) % 2 == 0){
res += map.get(c);
}else{
res += map.get(c)-1;
single = true;
}
}
res = single == true ? res + 1 : res;
return res;
}
}
2. 位运算+只生成长度为58的数组
利用 int[ ] 代替 map。
计算(每个出现的字符 - ’ A ')放入 int[ ] 中。
并且在统计出现次数时利用了ans += n - (n&1)
,其中n&1
如果 n 是偶数,那么结果为0,;如果 n 为奇数,那么结果为1。
最后如果 结果 < s.length()
,说明一定出现了奇数,那么最终结果 +1 。
class Solution {
public int longestPalindrome(String s) {
if(s == null || s.length() == 0){
return 0;
}
int ans = 0;
//这里之所以用58而不是56,ASCII表中,大写Z 和 小写a之间有6个特殊字符
int[] help = new int[58];
for(char c : s.toCharArray()){
help[c - 'A'] += 1;
}
for(int n : help){
ans += n - (n&1);//这里如果n是偶数,那么都是回文数,直接加;如果n是奇数,要减1
}
//如果最后ans长度小于s的长度,说明有奇数,那么ans+1作为最后结果
ans = ans < s.length() ? ans + 1 : ans;
return ans;
}
}
3. 统计奇数的个数
class Solution {
public int longestPalindrome(String s) {
if(s == null || s.length() == 0){
return 0;
}
int count = 0;
int[] help = new int[128];
for(char c : s.toCharArray()){
help[c]++;
}
for(int n : help){
count += n%2;//这里当然也可以改成 count += n & 1;
}
return count == 0 ? s.length() : (s.length()-count+1);
}
}