题目描述
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
解题思路
通过题目描述我们可以知道,一个字符串如果是个回文字符串,构成该字符串的字母除了中间的字母其他字母出现的次数都要为偶数
所以我们可以通过一个hashmap去记录每个字母出现的次数n,如果n为偶数,则直接加上n,如果为奇数,则加上n-1;
因为有出现过字母的次数是奇数,所以会存在一个中间的字母的次数是奇数
所以要在最后加1
代码如下
package leetcode;
import java.util.HashMap;
import java.util.Map;
public class LongestPalindrome {
public int longestPalindrome(String s) {
char[] chars=s.toCharArray();
Map<Character, Integer> map=new HashMap<Character, Integer>();
for (int i = 0; i < chars.length; i++) {
if (map.get(chars[i])==null) {
map.put(chars[i], 1);
}else {
map.put(chars[i], map.get(chars[i])+1);
}
}
int length=0;
int flag=0;
for (Map.Entry<Character, Integer> mEntry : map.entrySet()) {
if (mEntry.getValue()%2==0) {
length+=mEntry.getValue();
}else {
length+=mEntry.getValue()-1;
flag=1;
}
}
return length+flag;
}
}