[Leetcode] Longest palindromic substring 最長回文子串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
做這道題之前要先了解什麽是回文子串。回文串通俗的解釋是,分別從字符串兩端開始遍歷,得到的結果相同,如“abba”,從兩端的遍歷結果都是:“abba”。
判斷一個字符串是否為回文串的思路是使用兩個指針從,兩端開始向中間遍歷,看是否對應的字符是否相等,直到兩指針相等或者交叉。
方法一:以字符串中的每一個字符為中心遍歷字符串。
思路:本題的解決方法是從頭到尾的遍歷字符串S,以每個字符為中心,向兩端不停的擴展,同時判斷以當前字符為中心的兩端字符是否相等,在判斷的過程中找到最大的回文串長度,並記錄下回文串開始的最左端,這樣就找到了最大的回文串。但是這樣做就遇到了一個問題:“abcab”這種個數為奇數的回文串可以計算出來,但是若是"abba"這樣個數為偶數的情況,該如何計算?遇到這種情況,則,可以判斷相鄰兩字符是否相等來判斷是否為回文串,針對s=“abba”,我們發現 i=1時,s[i]==s[i+1],然後同時向兩端擴,發現s[ 0]=s[ 2],這樣該串也為回文串,所以,在判斷以某字符為中心的時候,要分兩種情況,即,回文串中字符的個數為奇數和為偶數的情況。時間復雜度是O(n*n)。代碼如下:
1 class Solution { 2 public: 3 string longestPalindrome(string s) 4 { 5 string res=""; 6 int len=s.size(); 7 if(len==1) return s; 8 int maxLen=0,curLen=0,sbegin; 9 10 for(int i=0;i<len;++i) 11 { 12 //奇數 13 intleft=i-1,right=i+1; 14 while(left>=0&&right<len&&s[left]==s[right]) 15 { 16 curLen=right-left; 17 if(curLen>maxLen) 18 { 19 maxLen=curLen; 20 sbegin=left; 21 } 22 left--,right++; 23 } 24 25 //偶數 26 left=i,right=i+1; 27 while(left>=0&&right<len&&s[left]==s[right]) 28 { 29 curLen=right-left; 30 if(curLen>maxLen) 31 { 32 maxLen=curLen; 33 sbegin=left; 34 } 35 left--,right++; 36 } 37 } 38 res=s.substr(sbegin,maxLen+1); //substring()為前閉後開 39 return res; 40 } 41 };
方法二:馬拉車算法Manacher‘s Algorithm,有點是:將時間復雜度降低為O(n)的地步。關於馬拉車算法Manacher‘s Algorithm,詳情見博客Manacher‘s Algorithm詳解。
[Leetcode] Longest palindromic substring 最長回文子串