【每日一題】最長迴文子串

5. 最長迴文子串

給你一個字符串 s,找到 s 中最長的迴文子串。

如果字符串的反序與原始字符串相同,則該字符串稱爲迴文字符串。

示例 1:

輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。

示例 2:

輸入:s = "cbbd"
輸出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 僅由數字和英文字母組成

這題常規思路是用動規,如果一個迴文串前後相鄰的兩字符相同,那麼就可以擴張成一個新迴文串。邊界條件就是子串的長度爲1或2,長爲1的子串自然是迴文串,長爲2若兩個字符相同那麼也是迴文串。換個角度我們也可以從邊界條件外推,也就是中心擴展法。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # dp(i,j)表示s[i..j]是否是迴文喘
        # dp[i,i] = 1
        # dp(i,i+1) = 1 when s[i]==s[i+1]
        # dp(i,j) = 1 when dp(i+1,j-1)==1 and s[i]==s[j]
        
        # 從邊界條件向外擴展
        def expand(s, l, r):
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l -= 1
                r += 1
            return l+1, r-1

        l, r = 0, 0
        for i in range(len(s)):
            l1, r1 = expand(s, i, i) # 邊界條件 長度爲1的子串
            l2, r2 = expand(s, i, i+1) # 邊界條件 長度爲2的子串
            if (r1-l1) > (r-l):
                l, r = (l1, r1)
            if (r2-l2) > (r-l):
                l, r = (l2, r2)
        return s[l: r+1]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章