给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
时间: 2023-05-19 14:01:48 浏览: 100
回文字符串:判断一个是否是回文字符串。回文字符串是指正序(从左向右)和倒序(从右向左)读都是一样的字符串。
5星 · 资源好评率100%
可以使用动态规划来解决这个问题。定义一个二维数组 dp,其中 dp[i][j] 表示字符串 s 中从 i 到 j 的子串是否为回文子串。如果 s[i] == s[j],并且 s[i+1:j-1] 是回文子串,那么 s[i:j] 也是回文子串。根据这个定义,可以得到状态转移方程:
dp[i][j] = (s[i] == s[j] and dp[i+1][j-1])
边界条件是:
dp[i][i] = True
dp[i][i+1] = (s[i] == s[i+1])
最后遍历 dp 数组,找到最长的回文子串即可。时间复杂度为 O(n^2)。
以下是 Python 代码实现:
def longestPalindrome(s: str) -> str:
n = len(s)
dp = [[False] * n for _ in range(n)]
ans = ""
# 枚举子串的长度 l+1
for l in range(n):
# 枚举子串的起始位置 i,这样可以通过 j=i+l 得到子串的结束位置
for i in range(n):
j = i + l
if j >= n:
break
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] and l + 1 > len(ans):
ans = s[i:j+1]
return ans
print(longestPalindrome("babad")) # "bab" 或 "aba"
print(longestPalindrome("cbbd")) # "bb"
阅读全文