給定一個包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的迴文串。
示例 1:
輸入:
"abccccdd"
輸出:
7
解釋:
我們可以構造的最長的迴文串是"dccaccd", 它的長度是 7
迴文串分成偶數的迴文串和奇數的迴文串,對於偶數的迴文串,迴文串的每個字符的數量都是偶數,對於奇數的迴文串,除了中間的字符,其餘字符的數量都是偶數。
解法一:
class Solution {
public:
int longestPalindrome(string s) {
if(s.empty()) return 0;
unordered_map<char,int> freq; //記錄頻率
for(int i = 0; i < s.size(); i++){
freq[s[i]]++;
}
int res = 0;
for(auto it = freq.begin(); it != freq.end(); it++){
if((it->second)%2 == 0){
res += it->second;
}
if((it->second -1)%2 == 0){
res +=it->second - 1;
}
}
if(res < s.size()){//當前迴文子串的長度小於原來的大小,說明可以湊成奇數的迴文串
res += 1;
}
return res;
}
};
因爲字符串中的字符都是確定的,是大小寫,可以使用ASCII碼來表示,'A’的ASCII碼值是65,'z’的ASCII碼值是122。
class Solution {
public:
int longestPalindrome(string s) {
if(s.empty()) return 0;
vector<int> freq(58,0); //記錄頻率
for(int i = 0; i < s.size(); i++){
freq[s[i]-'A']++;
}
int res = 0;
for(int i = 0; i < 58; i++){
/*
if(freq[i]%2 == 0){
res += freq[i]; //出現了偶數次
}
if((freq[i]-1)%2 == 0){ //出現了奇數次
res += freq[i] - 1;
}*/
//看了別人的代碼,上面的可以簡化成這一句
res += freq[i] - (freq[i]&1);
}
if(res < s.size()){//當前迴文子串的長度小於原來的大小,說明可以湊成奇數的迴文串
res += 1;
}
return res;
}
};