概述
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
回文串要保证串中的字符出现次数为 2 的倍数,且最多只有一个奇数出现次数的字符。
将字母保存到 Hash 表,key 为 字符,value 为字符出现次数。遍历 Hash 表,对于每个字符来说,它可以增加回文串的长度为 (value/2)*2。
若 value 为偶数,那么它可以全部加入到回文串,若 value 为奇数,那么它可以留一位作为最后一个字符加入到回文串中
若 value = 1,(value/2)* 2 = 0
class Solution {
public int longestPalindrome(String s) {
// 用数组保存每个字符出现的次数
int[] count = new int[128];
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// ASCII值
count[c]++;
}
int result = 0;
boolean flag = false;
for (int i : count){
// 每个字符可以增加回文串的 长度
result += (i/2)*2;
// 字符出现奇数个数
if (i % 2 == 1){
// 可以作为最后的字符加入回文串
flag = true;
}
}
if (flag){
result++;
}
return result;
}
}