给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
**注意:**假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
哈希表
因为是打散构造回文字符串,那么只有奇数数量的字母才会被剩下1个。同时所有的偶数数量字母+1一个奇数数量的字母也可以构造回文字符串。
所以我们可以对给定字符串一次遍历,构造出哈希表。再遍历哈希表的每一个字母,记录下奇数数量字母的总数。
最后返回的是字符串长度 - 奇数数字字母的数量 + 1。
鉴于本体约定了字符串仅包含字母,可以直接通过数组进行构造,减少哈希表带来的性能损失。
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);
}
- 时间复杂度:O(n) 遍历两次,一次构造哈希表,一次遍历哈希表
- 空间复杂度:O(n) 额外的哈希表空间