題目鏈接:5. 最長回文子串 - 力扣(LeetCode)
普通版本(暴力枚舉)
解題關鍵:
1、記錄最長回文字串的長度和起始字符的下標
2、判斷回文字串的邏輯與整體邏輯分離
3、先確定尋找回文字串的邊界范圍后從兩邊向中間尋找
class Solution {
public://從兩側向中間尋找string longestPalindrome(string s) {int sz = s.size();if(sz < 2) return s;int lengthMax = 1;//當前最長回文字串的起始長度int begin = 0;//當前最長回文字串的起始下標for(int i = 0;i<sz-1;i++)//回文不可能到數組末尾,因為如果這樣的話{for(int j = i + 1;j<sz ;j++){//判斷[i,j]范圍內的子串是不是回文子串,如果是,且回文字串的長度大于之前記錄的范圍內的子串是不是回文子串,如果是,且回文字串的長度大于之前記錄的lengthhMax,就更新lengthMax和回文子串的下標i,就更新lengthMax和回文子串的下標iif(j - i + 1 > lengthMax && judgeLPS(s,i,j))//LPS是最長回文子串Longest palindromic substring的縮寫{lengthMax = j - i + 1;begin = i; }}}return s.substr(begin,lengthMax);
}private:bool judgeLPS(const string& s,int left,int right)//防止字符串過長導致的超出內存限制問題,傳引用傳參進行判斷{while(left < right){if(s[left] != s[right]){return false;}else{left++;right--;}}return true;//在[i,j]范圍內都相同了就返回真}
};
時間復雜度:O(N^3)(兩層for循環中還有一個while)
優化版本(中心擴散,待補充)
優化版本(動態規劃,待補充)
~over~