[LeetCode]題解(python):005-Longest Palindromic Substring


 

題目來源:

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
View Code

 


轉載請注明出處:http://www.cnblogs.com/chruny/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM