[LeetCode]409. 最长回文串(java实现)
1. 题目
2. 读题(需要重点注意的东西)
需要注意到的是:
- 字符串中既有大写字母,又有小写字母,因此数组长度要为 26x2 = 52;
- 要知道A的ascii码值为97,a的ascii码值为65
- 不能直接’a’ <= c <= ‘z’,要使用&&连接:‘a’ <= c && c <= ‘z’
解法:使用哈希表。主要思路是用哈希集合存储字符串中字母出现的次数,然后找有多少对相同的字符,如果刚好有n对,长度为2n;有n对但还有剩余,长度为2n+1。由于只有52个字母,因此使用数组来代替哈希表来求解,更简单。数组可视为一种简化版的哈希表。
3. 解法
解法:
class Solution {
// 找字符串中有几对相同的字符即可
// 刚好有n对,长度为2n
// 有n对但还有剩余,长度为2n+1
public int longestPalindrome(String s) {
int[] ans = new int[52];
for(char c : s.toCharArray()){
if('a' <= c && c <= 'z'){
ans[c - 'a']++;
}
else{
ans[c - 'a' + 58]++;
}
}
// 用 n 来记录对数,用 flag 来确定有无剩余字符
int n = 0 , flag = 0;
for(int i = 0; i < 52 ; i++){
if(ans[i] % 2 != 0) flag = 1;
n = ans[i] / 2 + n;
}
if(flag == 1) return 2*n+1;
return 2*n;
}
}
部分代码解释可在Java数据结构—String(字符串及其常用操作)中得到介绍
4. 可能有帮助的前置习题
[LeetCode]242. 有效的字母异位词(java实现)
5. 所用到的数据结构与算法思想
6. 总结
掌握好字符串迭代遍历的方法
for(char c : t.toCharArray()){
// 所要进行的操作
}