一、題目
給定一個包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的迴文串。
在構造過程中,請注意區分大小寫。比如 "Aa"
不能當做一個迴文字符串。
注意:
假設字符串的長度不會超過 1010。
示例 1:
輸入: "abccccdd" 輸出: 7 解釋: 我們可以構造的最長的迴文串是"dccaccd", 它的長度是 7。
二、題解思路
- 題解思路:迴文數:從左往右讀和從右往左讀是一樣的數。先將字符串存到map中,如果這個字符出現的次數爲偶數,則可以加到迴文數的長度上;如果這個數是奇數且大於2,則可以將其減一,然後加到迴文數的長度上;因爲如果迴文數的長度是奇數,就說明中間那個可以是隻出現一次的單個字符,或者出現奇數次,然後減掉的那一個字符,因此我們使用flag記錄這種情況的出現,如果不爲0,則最後可以在上一步計算完長度的基礎上加1,從而就是最後的長度。
三、代碼實現
- C++代碼實現
class Solution {
public:
int longestPalindrome(string s)
{
int count = 0; //迴文數的長度
int flag = 0;
map<char,int> nums; //存取string中的單個字符串及其出現次數
for(int i = 0;i<s.size();i++)
nums[s[i]]++;
for(auto c:nums) //遍歷map
{
if(c.second%2 == 0) //字符出現次數爲偶數
count += c.second;
else if(c.second > 2 && c.second%2 == 1) //字符出現次數爲奇數
{
count += c.second - 1;
flag++;
}
else //字符出現次數爲1次
flag++;
}
return flag != 0 ? count+1:count; //判斷是總和加1還是不加
return 0;
}
};