[LeetCode] 5. Longest Palindromic S

fondtiger發表於2021-09-09

問題描述

給定一個字串 s,找出其中最長的迴文子字串,假設 s 的最大長度為 1000。

例 1:

輸入: "babad"
輸出: "bab"
注意: "aba" 也是正確的答案

例 2:

Input: "cbbd"
Output: "bb"

問題難度

Medium

解題思路

注意到迴文的對稱性特點,我們只需要在遍歷 s 的過程中,假設每一個字元都是迴文的中心,對於每一個迴文中心,我們不斷向兩邊擴充套件,同時檢測其對稱性,找出該回文的邊界,並記錄其長度,最終,當遍歷完 s 之後,我們便檢測了 s 中所有的迴文,當然就可以得到 s 中最長的迴文子字串。這種方法的時間複雜度為 KaTeX parse error: Expected 'EOF', got '​' at position 7: O(n^2)​̲

需要注意的是,迴文有兩種形式:單中心和雙中心,所以我們在遍歷每個字元時,不僅要把當前字元當做單中心迴文的中心,還要將當前字元和下一個字元當做雙中心迴文的中心,並分別以這兩個中心向兩邊擴充套件。

全部程式碼如下:

class Solution():
    def expand(self, left, right, s):
        """
        expand from middle point
        """
        if right >= len(s) or s[left] != s[right]:
            return 0

        while left-1 >= 0 and right+1 < len(s) and s[left-1] == s[right+1]:
            left -= 1
            right += 1

        return right + 1 - left

    def longest_palindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if not s:
            return ""

        middle = 0
        max_len = 0
        for i in range(len(s)):
            len1 = self.expand(i, i, s)
            len2 = self.expand(i, i+1, s)
            longer = max(len1, len2)
            if longer > max_len:
                max_len = longer
                middle = i

        begin = middle-int((max_len-1)/2)
        return s[begin:begin+max_len]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2508/viewspace-2823033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章