题目描述
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a"
输入:1
示例 3:
输入:s = "bb"
输入: 2
提示:
1 <= s.length <= 2000
s 只能由小写和/或大写英文字母组成
代码演示
class Solution {
public int longestPalindrome(String s) {
// 找出可以构成最长回文串的长度
int[] arr = new int[128];
for(char c : s.toCharArray()) {
arr[c]++;
}
int count = 0;
for (int i : arr) {
count += (i % 2);
}
return count == 0 ? s.length() : (s.length() - count + 1);
}
}
思路
第一次的循环是将所有的字母的次数输入数组中去。利用ASCII码
第二次是:如果i%2 == 0,则说明是偶数,那么count+=0,count加到的值都是非偶数,即出现奇数次的字母。所以我们在最后判断,如果count的值为0,说明全部的字母出现频率为偶数,即==0,那么输出字符串s的长度;如果不等于0,说明存在出现奇数次的字母,那么就用s的长度减去count的值(减掉所有出现奇数次的字母值),之后+1,让一个出现一次的字母放在最中间,构成回文数。