题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
思路
动态规划
当字符串 s[i...j] 的长度为1,则它是回文串;
当字符串s[i...j]的长度为2,且s[i]=s[j],则它是回文串,否则不是;
当字符串s[i...j]的长度大于2,如果s[i]=s[j],并且s[i+1...j-1]是回文串,则它是回文串,否则不是.
填表顺序:从下往上,填写矩阵的上三角区域。
代码
import sys
if __name__ == "__main__":
s = sys.stdin.readline()
length = len(s)-1
if length <= 1:
print(s)
sys.exit()
dp = [[0 for _ in range(length)] for _ in range(length)]
for i in range(length):
dp[i][i]=1
max_length = 0
start = 0
for i in range(length-2,-1,-1):
for j in range(i, length):
## 填表
if j-i == 1:
if s[i] == s[j]:
dp[i][j] = 1
else:
if s[i] == s[j] and dp[i+1][j-1] == 1:
dp[i][j] = 1
## 记录最大值
if dp[i][j] == 1 and j - i > max_length:
max_length = j - i
start = i
print(s[start:start + max_length+1])
sys.exit()
复杂度
时间复杂度:O(n^2)
空间复杂度:O(n^2)