📅  最后修改于: 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$数组。