# 5. 寻找最长回文子串:正读和反渎都一样的字串
def maxhuiwen(s):
n = len(s)
dp = [[False for i in range(n)] for j in range(n)]
ans = ""
for l in range(n): # 判断不同长度的子串情况
for i in range(n): # 起始位置
j = i + l # 结束位置
if j >= n: # 结束位置不超过长度(从0开始)
break
if l == 0:
dp[i][j] = True # 单个字符本身就是回文字符
elif l == 1:
dp[i][j] = s[i] == s[j] # 两个字符时,只要这两个字符相等,就是回文字符s[i] == s[j]返回true或false
else: # 当判断字符情况大于2时,当去掉收尾字符的子串是回文字符+收尾字符相等时就是回文字符
dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
if dp[i][j] and l + 1 > len(ans):
ans = s[i:j + 1]
return ans
print(maxhuiwen(s='abababababababa'))
代码核心在于:
dp[i][j] :若从i到j的子串是回文子串,dp[i][j]的值为true,否则为false
当去掉收尾字符的子串是回文字符+收尾字符相等时就是回文字符:
dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])