1. 程式人生 > >Leetcode中級演算法之最長迴文子串(5)C++

Leetcode中級演算法之最長迴文子串(5)C++

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:

輸入: “cbbd”
輸出: “bb”

這道題在網上看到了許多解法,如動態規劃,馬拉車解法,看得一知半解,最後找到一個求最長子串長度的解法,在它的基礎上得到了如下通俗解法,時間複雜度為O(N^2)

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length();
        if(n < 1)   return "";
        int count=0, maxLen=0;  
        for(int i=0;i<n;i++)
        {
            for(int j=0;(i-j)>=0&&(i+j)<n;j++)	//當子串長度為奇數時
            {
                if(s[i-j] != s[i+j])    
                    break;
                count = 2 * j + 1;
                if(count > maxLen)
                    maxLen = count;
            }
            for(int k=0;(i-k)>=0&&(i+k+1)<n;k++)	//當子串長度為偶數時
            {
                if(s[i-k] != s[i+k+1])
                    break;
                count = 2 * k + 2;
                if(count > maxLen)
                    maxLen = count;		//到此步得到了原字串的最長子串的長度maxLen
            }
        }
        for(int i=0;i<=n-maxLen;i++)	//從原陣列擷取maxLen長度的子串,為迴文就返回
        {
            string longestSubstr = s.substr(i,maxLen);
            if(ishuiwen(longestSubstr))
                return longestSubstr;
        }
        
    }
    bool ishuiwen(string s)		//判斷字串是否為迴文
    {
        if(s.length()<2)
            return true;
        int n = s.length();
        for(int i=0;i<n/2;i++)
            if(s[i] != s[n-i-1])
                return false;
        return true;
    }
};

思路:迴圈原字串,以每一個字元為中點向左右遍歷,得到最長子迴文串的長度maxLen(注意子串長度的奇偶),然後擷取maxLen長度的子串判斷是否為迴文即可.