題目來源:
https://leetcode.com/problems/longest-palindromic-substring/
題意分析:
這道題目是輸入一段不超過1000的字符串,輸出最長的回文子字符串,輸入的字符串有一個唯一的最長回文子字符串(個人覺得這個沒什么用,還限制了一些輸入,比如長度為2的時候肯定就只能輸入兩個相同的字符,還不如改為有同樣長度的輸出第一個最長回文子字符串,所以該題目我是按照第一個最長回文子字符串)。
題目思路:
題目的字符串長度是1000,如果我們暴力解決,那么構造字符串時間復雜度(O(n^2)),判斷字符串是不是回文字符串時間復雜度(O(n))總的時間復雜度是(O(n^3)),如果暴力解決,那么肯定是會TLE的。
尋找回文字符串一般有兩種方法。第一種是先構造一個字符串,從首尾開始判斷是否對應相等。這種方法需要的時間復雜度比較大。第二種方法是從中間往兩邊找,直到找到兩邊不一樣。這種方法我們要先確定中間的key字符,這里由於當重復字符出現的時候,應該把這些重復的字符捆在一起,因為重復字符出現的時候放中間可以保證滿足是回文字符串。比如’'abbbbba’,如果我們將’bbbbb’捆在一起可以減少很多不必要的判斷,而且可以避免回文字符串個數為偶數的時候被忽略的情況,比如’abba’。
那么我們可以初始化回文子字符串為s[0],長度是1,從第一個字符開始往兩邊找,記錄從這個字符為中間字符搜索的回文字符串的長度,如果大於當前記錄的回文,那么替換當前的字符串及其長度。從中間找到了最后一位或者以最后一個字符為中間key字符的時候結束。這種方法最壞的情況是’ababababababababa……bac’,這種情況的時間復雜度是(0 + 1 + 2 +…+n - 1) = (O(n^2)),由於字符串長度為1000,所以(O(n^2))的時間復雜度是可以接受的。
代碼(python):

1 class Solution(object): 2 def longestPalindrome(self, s): 3 """ 4 :type s: str 5 :rtype: str 6 """ 7 size = len(s) 8 if size == 1: 9 return s 10 if size == 2: 11 if s[0] == s[1]: 12 return s 13 return s[0] 14 maxp = 1 15 ans = s[0] 16 i = 0 17 while i < size: 18 j = i + 1 19 while j < size: 20 if s[i] == s[j]: 21 j += 1 22 else: 23 break 24 k = 0 25 while i - k - 1 >= 0 and j + k<= size - 1: 26 if s[i- k - 1] != s[j + k]: 27 break 28 k += 1 29 if j - i + 2*k > maxp: 30 maxp = j- i + 2*k 31 ans = s[i - k:j + k] 32 if j + k == size - 1: 33 break 34 i = j 35 return ans
轉載請注明出處:http://www.cnblogs.com/chruny/