📜  门|门 CS 1997 |第 61 题(1)

📅  最后修改于: 2023-12-03 15:12:45.978000             🧑  作者: Mango

题目描述

给定一个字符串s,求它的最长回文子串的长度。

示例

例如,字符串"babad"的最长回文子串为"bab"或者"aba",长度为3。

思路

可以使用动态规划的方法进行求解。

定义dp[i][j]表示从第i个字符到第j个字符是否为回文子串,如果是,则为true,否则为false

根据回文子串的定义,如果一个字符串是回文子串,那么去掉开头和结尾的字符,剩下的字符串仍然是回文子串。

因此我们可以得出状态转移方程:

如果 s[i] == s[j],且 dp[i+1][j-1] == true,则 dp[i][j] = true
否则 dp[i][j] = false

此外,还需要注意处理边界情况,即当子串长度为1或2时的情况,需要单独处理。

最后需要遍历所有的dp数组的元素,找到最长的回文子串。

代码示例

class Solution:
    def longestPalindrome(self, s: str) -> int:
        n = len(s)
        dp = [[False] * n for _ in range(n)]
        ans = 0

        for l in range(n):
            for i in range(n - l):
                j = i + l
                if l == 0:
                    dp[i][j] = True
                elif l == 1:
                    dp[i][j] = (s[i] == s[j])
                else:
                    dp[i][j] = (s[i] == s[j] and dp[i+1][j-1])
                if dp[i][j]:
                    ans = max(ans, l + 1)

        return ans

时间复杂度:$O(n^2)$,其中$n$为字符串的长度。空间复杂度:$O(n^2)$,需要存储$dp$数组。