题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
解题思路
本题考虑使用动态规划求解,有以下两种情况需要考虑:
(1) 如果一个字符串是回文串,那么在它左右分别加上一个相同的字符,那么它一定还是一个回文串;
(2) 如果在一个不是回文字符串的字符串两端添加任何字符,或者在回文串左右分别加不同的字符,得到的一定不是回文串。
具体代码
def run(s):
n = len(s)
ans = ''
# 构造二维数组
dp = [[False] * n for _ in range(n)]
# m表示子串的长度
for m in range(n):
for i in range(n):
# i为子串的开始位置,j记录子串的结束位置
j = i + m
if j >= n:
break
# 若只有一个子串,则为回文子串
if m == 0:
dp[i][j] = True
# 若子串的长度是2,若两个字符相等,则为回文子串
elif m == 1:
dp[i][j] = (s[i] == s[j])
# 若子串的长度超过2,则看最左和最右的字符是否相等,且以前的字符是否是回文子串
else:
dp[i][j] = (s[i] == s[j] and dp[i + 1][j - 1])
# 若子串满足回文子串的要求,且子串的长度大于现有的子串ans的长度,则更新ans
if dp[i][j] and m + 1 > len(ans):
ans = s[i:j + 1]
return ans
def main():
s = str(input())
res = run(s)
print(res)
main()
复杂度
时间复杂度为O(n^2)
空间复杂度为O(n^2)