[LeetCode]5、最长回文字串

2019-07-27  本文已影响0人  河海中最菜

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

思路:

class Solution:
    def longestPalindrome(self, s):
        if not s or len(s) == 0:
            return ""
        ans = ""
        for i in range(len(s)):
            ans = self.helper(s, i, i, ans)
            ans = self.helper(s, i, i + 1, ans)
        return ans

    def helper(self, s, left, right, ans):
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
            if (right - left - 1) > len(ans):
                ans = s[left+1:right]
        return ans

AC5中心扩散
class Solution1:
    def longestPalindrome(self, s):
        if not s:
            return ""
        n = len(s)
        # 动态数组记录是否是回文,然后计算长度
        dp = [[0] * n for _ in range(n)]
        max_len = float("-inf")
        for i in range(n):
            for j in range(i+1):
                # 如果满足s[j]和s[i]相等,如果,dp[j+1][i-1]是,dp[j][i]也是回文
                # 还有3种情况,概括为 i - j <= 2.代表j到i中只有一个元素,没有元素,i == j,都是直接成立的
                if s[i] == s[j] and (i - j <= 2 or dp[j+1][i-1]):
                    dp[j][i] = 1
                if dp[j][i] == 1 and (i - j + 1) > max_len:
                    max_len = i + 1 - j
                    res = s[j:i+1]
        return res

AC5动态规划
上一篇 下一篇

猜你喜欢

热点阅读