解题思想
1.中心扩展法
从字符串中心分别往左右两端移动, while l>=0 r<n s[r]=s[l]
易混点: 回文串的起始值 = i-(循环中回文串的长度-1)//2 看不懂找数带入即可
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
def getlen(l,r):
while l>=0 and r<n and s[l] == s[r]:
l -=1
r +=1
return r-l-1
start = 0
length = 0
for i in range(n):
cur = max(getlen(i,i), getlen(i,i+1))
if cur <=length:
continue
length = cur
start = i - (cur-1)//2
return s[start:start+length]
2.动态规划法
动态规划经典题目:斐波那契数列,背包问题
动态规划常用来解决 重叠子问题
一般递归可解决的,用动态规划会减小复杂度
class Solution:
def longestPalindrome(self, s: str) -> str:
n=len(s)
dp = [[0]*n for _ in range(n)]
ans = ""
for l in range(n):
for i in range(n):
j = i + l
if j >= len(s):
break
if l == 0:
dp[i][j] = True
elif l == 1:
dp[i][j] = (s[i] == s[j])
else:
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