构造最长的回文串
题目描述
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的最长的回文串 。
示例
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
分析
- 统计每个字符出现的次数
- 出现偶数次的字符,肯定能够组成回文串
- 出现奇数次的字符,奇数次减1变成偶数次,也即:减掉一个字符后,肯定能够组成回文串
- 可以将第一次出现奇数次的那个字符,选为回文串的中间字符,也能组成回文串。但是中间位置只有一个,因此只能加1次。比如 aabc,最长回文子串是:aba,中间字符只有一个,即为字符 'b'
代码
public int longestPalindrome2(String s) {
int[] arr = new int[128];
for (int i = 0; i < s.length(); i++) {
//字符的范围是 0-127
char c = s.charAt(i);
//统计每个字符出现的次数
arr[c]++;
}
int totalLen = 0;
//标识字符串 s 中 第一次出现奇数次 的那个字符, 可以将此字符放到回文串最中间
boolean firstOddNumber = true;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
//出现次数为偶数的字符,肯定可以组成回文串
totalLen += arr[i];
} else {
//出现次数为为奇数,奇数的次数-1 肯定可以组成回文串
totalLen += arr[i] - 1;
if (firstOddNumber) {
//选择第一次的奇数,可以放到回文的最中间,因此回文的长度加1
totalLen++;
//最中间位置只会有一个字符,因此放完之后,其它字符都不能放了,故 firstOddNumber 设置为 false
firstOddNumber = false;
}
}
}
return totalLen;
}
leetcode 原文:https://leetcode.cn/problems/longest-palindrome/submissions/