最长回文子串

· 约 1 分钟阅读 · 次阅读 leetcode

给你一个字符串 s,找到 s 中最长的回文子串。

 

示例 1:

输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2:

输入:s = “cbbd” 输出:“bb”

中心扩展法

class Solution:
    def longestPalindrome(self, s: str) -> str:
        def helper(s, i, j):
            while i >= 0 and j < length and s[i] == s[j]:
                i = i - 1
                j += 1
            return i+1, j-1
        length = len(s)
        count = 0
        result = ""
        for i in range(length):
            left,right = helper(s, i, i+1)
            if right -left >= count:
                count = right - left
                result = s[left:right+1]
            # 这个地方比较巧妙
            left,right = helper(s, i, i)
            if right -left >= count:
                count = right - left
                result = s[left:right+1]
        return result

动态规划的方法

1.长度为1的串 必然为回文串 2.长度为2的串 如果字母相同也是回文串 3.如果s[i+1, j-1]是回文串且s[i]==s[j]则s[i, j]也是回文串

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        if n < 2:
            return s
        
        dp = [[False]*n for _ in range(n)]
        max_length = 1
        left = 0
        # L 表示子串长度
        for L in range(1, n+1):
            # i表示左index,j表示右index
            for i in range(n):
                j = L + i - 1
                # j非法时,退出循环
                if j > n - 1:
                    break
                if s[i] != s[j]:
                    dp[i][j] = False
                else:
                    if L <= 2:
                        dp[i][j] = True
                    else:
                        dp[i][j] = dp[i+1][j-1]
                if dp[i][j] and L > max_length:
                    max_length = L
                    left = i
        return s[left:left+max_length]



Manacher算法

TODO