—— Longest Palindromic Substring

5、Longest Palindromic Substring

最長迴文子串

給出一個字符串(假設長度最長爲1000),求出它的最長迴文子串,你可以假定只有一個滿足條件的最長迴文串。

樣例

給出字符串 "abcdzdcab",它的最長迴文子串爲 "cdzdc"

挑戰 

O(n2) 時間複雜度的算法是可以接受的,如果你能用 O(n) 的算法那自然更好。

我的代碼:

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.empty())return "";//字符串爲空
        if(s.size()==1)return s;//字符串爲1
        int start=0,max_len=1;//迴文串開始位置,迴文串長度
        for(int i=0;i<s.size();i++)
        {
            if(s.size()-i<=max_len)break;//剩餘字符串長度小於已知的迴文串長
            int l=i,r=s.size()-1,last=r;//左邊元素,右邊元素,迴文串結束位置
            bool FF=false;//觸發器(對應元素是否相等)
            while(l<=r&&last-i+1>max_len)//迴文串未遍歷完,迴文串大於已知長度
            {
                if(s[l]==s[r]){l++;r--;FF=true;}//對應元素相等,左右移動
                else {l=i;last--;r=last;FF=false;}//不等,回到初始位置,右邊界移動
            }
            if(FF==true&&last-i+1>max_len)//替換最大回文串
            {
                start=i;
                max_len=last-i+1;
            }
        }
        return s.substr(start,max_len);//(字符串開始位置,和長度)
        
    }
};

經典代碼:

lass Solution {
public:
    /*
    題意爲求最長迴文子串, 直接枚舉子串首尾位置再判斷是否會問,時間複雜度爲O(N^3),
    換個思路,枚舉迴文串的對稱中心位置,向兩側掃描檢測最長迴文長度時間複雜度爲O(N^2)
    對於最長迴文子串問題有對應O(N)算法--Manacher算法
    */    
    string longestPalindrome(string s) {
        string str = "", ans = "";
        int len = s.length();
        int maxl = -1, cnt;
        for (int i = 0; i < len; i++) {
            str += '#';
            str += s[i];
        }
        str += '#';
        // 將原字符串擴展成#a#b#的形式可以直接枚舉長度,不用考慮迴文串長度的奇偶性
        for (int i = 1; i < 2 * len; i++) {
            cnt = 0;
            while ((i - cnt >= 0) && (i + cnt <= 2 * len) && (str[i - cnt] == str[i + cnt]))
                cnt++;
            cnt--;
            if (cnt > maxl) {
                maxl = cnt;
                ans = s.substr((i - cnt) / 2, (i + cnt) / 2 - (i - cnt) / 2);
            }
        }
        return ans;
    }
};


發佈了71 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章