给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意: 假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindrome/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
基本思路是回文串中是字符的格式全部为偶数个或只有一个字符为奇数个,如果给定字符串中不存在个数为奇数的字符,只要计算给定的字符串中所有字符的和即为目标值,否则则计算偶数和(奇数-1)的和,结果+1
使用map
class Solution {
public int longestPalindrome(String s) {
if(s==null||s.length()==0){
return 0;
}
Map<Character,Integer> map = new HashMap();
for(char c:s.toCharArray()){
if(map.containsKey(c)){
map.put(c,map.get(c)+1);
}else{
map.put(c,1);
}
}
int len = 0;
boolean flag = false;//是否有奇数
for(char key:map.keySet()){
if(map.get(key)%2==0){
len+=map.get(key);
}else{
flag = true;
len+=map.get(key)-1;
}
}
return flag?len+1:len;
}
}
使用固定长度数组
class Solution {
public int longestPalindrome(String s) {
int len = 0;
int[] hash = new int[58];//A(65)-z(122)
for(char c:s.toCharArray()){
hash[c-'A']++;
}
for(int v:hash){
len+=v-(v&1);//偶数相加,奇数减去1,&运算符 同位为1则结果为1
}
return len<s.length()?len+1:len;
}
}