Leetcode5. 最長迴文子串

題目要求
image.png函數

  • 思路:spa

    • 若是a是迴文字符串,那麼若是 a的左側字符=a的右側字符 ,【a左側字符+a+a的右側字符】也是一個迴文串
    • 同理,若是bab是迴文字符串,那麼 若是最左側b的左側字符 = 最右側的b的右側字符,那麼【最左側b的左側字符 + bab +最右側的b的右側字符】也是一個迴文字符串
    • 因此能夠編寫一個函數get_str,給定已知迴文子字符串的最小下標和最右下標,而後橫向擴散去尋找回文字符串。code

      • 例如 字符串 s = "babad",b的下標爲2,b爲一個迴文子字符串,那麼把2做爲字符串的左下標left,2同時做爲字符串的右下標right,讓函數get_str去向左向右尋找,若是left > 0 and right < len(s) and s[left] == s[right],就讓left - 1,right + 1,而後在比較s[left-1]與s[right+1]是否相等,且下標不超過0和len(s)
    • 那麼如何肯定要給get_str什麼樣的下標呢,能夠經過遍歷字符串sblog

      • 每遍歷到一個字符,有兩種狀況字符串

        • 一、這個字符是中心字符,例如bab,a就是中心字符,那麼給get_str的左下標和右下標都是a的下標
        • 二、這個字符和這個字符的下一個字符共同組成中心字符,例如,baab,那麼給get_str,左側a的下標做爲左下標,右側a的下標做爲右下標
    • 還須要有兩個變量,start,end,用來保存當前最長子迴文串的左下標和右下標,若是get_str找到比當前臨時保存的子字符串更長的迴文串,要更新start和end,最後返回s[start,end + 1](由於s[start:end]會不算上end)
  • 核心代碼
class Solution:
    def longestPalindrome(self, s: str) -> str:
        
        def get_str(left, right, s):
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -= 1
                right += 1
            # 返回left+1和right-1是由於最後一次while循環會對left多減一,對right多+1,這時的left和right左右會多各多算一個字符
            return left + 1, right - 1
        
        start, end = 0, 0
        for i in range(len(s)):
            # 兩種狀況
            left1, right1 = get_str(i, i, s)
            left2, right2 = get_str(i, i + 1, s)
            # 若是搜索到比當前迴文子字符串更長的,就要更新
            if right1 - left1 > end -start:
                start, end = left1, right1
            if right2 - left2 > end -start:
                start, end = left2, right2
        return s[start:end + 1]

完整代碼get

class Solution:
    def longestPalindrome(self, s: str) -> str:
        
        def get_str(left, right, s):
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -= 1
                right += 1
            return left + 1, right - 1
        
        start, end = 0, 0
        for i in range(len(s)):
            left1, right1 = get_str(i, i, s)
            left2, right2 = get_str(i, i + 1, s)
            if right1 - left1 > end -start:
                start, end = left1, right1
            if right2 - left2 > end -start:
                start, end = left2, right2
        return s[start:end + 1]
相關文章
相關標籤/搜索