最长回文串
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
链接
链接:https://leetcode-cn.com/problems/longest-palindrome/
代码与改进
public int longestPalindrome(String s) {
//因为大小写一共有52个字母,
//所以声明一个长度为52的数组,用来储存每个字母出现的次数
int arr[]=new int[52];
int sum=0;
for (int i = 0; i <s.length(); i++) {
if (s.charAt(i)>='a'&&s.charAt(i)<='z'){
arr[s.charAt(i)-'a']++;
} else {
arr[s.charAt(i)-'A'+26]++;
}
}
//用来判断,如果是偶数则一定能构成回文串
//如果存在奇数,则取一个奇数放在中间,其他的奇数则-1变成偶数
for (int i=0;i<52;i++){
sum=sum+arr[i]-(arr[i]%2);
}
//若存在奇数则返回时要加1
return sum<s.length()?sum+1:sum;
}
上述代码在刚开始时要进行大量的分支判断语句
这样会大大的降低我们的代码效率
public int longestPalindrome(String s) {
//这里注意,我们用这种方法声明的数组空间是58,而不是52
//这是因为在ASCII表中大写字母和小写字母中间有几个特殊字符
int arr[]=new int[58];
int sum=0;
for (char c : s.toCharArray()) {
arr[c - 'A'] += 1;
}
for (int i=0;i<58;i++){
sum=sum+arr[i]-(arr[i]%2);
}
return sum<s.length()?sum+1:sum;
}