Leetcode——409.最長迴文串——題解+代碼實現(使用map)

一、題目


給定一個包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的迴文串。

在構造過程中,請注意區分大小寫。比如 "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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章