一道很经典的题目
第一次做是用的center 两边延伸的方法叫做(Manacher)
一种专门用来解决此类问题的算法叫做“马拉车算法”,总体思想是“中心扩展”. 需要O(n^2)
的时间复杂度, 第二次我想用dp 发现好像还是n^2,我真的会谢。 但是巩固一下dp吧。
构造二维dp[left][right],表示以left为起始位置,right为终止位置的substring是否是回文串 初始都设置为false, 然后把 dp[i][i] 都初始化为True 因为
状态转移方程: dp[i][j] = dp[i+1][j-1] and (if s[i]==s[j])
看这个substring能不能行 就是看他包着的
循环从子串末尾开始,j从1到n, i从 0
到 j-1
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
if n<=1:
return s
dp = [[False for _ in range(n)]for _ in range(n)]
for i in range(n):
dp[i][i] = True
max_l = 1
start = 0
# i is right, j is left
for j in range(1, n):
for i in range(0,j):
if s[i] == s[j]:
if j-i<=2:
dp[i][j] = True
else:
dp[i][j] = dp[i+1][j-1]
if dp[i][j] and j-i+1 > max_l:
max_l = j - i + 1
start = i
return s[start: start+max_l]