class Solution:
def cuttingRope(self, n: int) -> int:
dp = [[0]*(n+1) for i in range(n+1)]
for i in range(1,n+1):
dp[i][1] = i
for i in range(2,n+1):
for j in range(2,i+1):
lmax = 0
for k in range(j-1,i):
if dp[k][j-1]*(i-k)>lmax:lmax=dp[k][j-1]*(i-k)
dp[i][j]=lmax
return max(dp[n][2:])
观察可得如果s[i]结束的最长回文串比s[i-1]长,只能是延长s[i-1]的串,否则只能另成一条新串,寻找这条新串的方法是,遍历s[i-1]起点及其后面的节点寻找新回文串。
class Solution:
def longestPalindrome(self, s: str) -> str:
dp = [0]*len(s)
be = [0]*len(s)
dp[0],be[0]=s[0],0
def huiwen(s):
cur1,cur2 = 0,len(s)-1
while cur1<cur2:
if s[cur1]!=s[cur2]:return False
cur1+=1
cur2-=1
return True
def f(s,cur):
if be[cur-1]-1>=0 and s[cur]==s[be[cur-1]-1]:#cbabc
dp[cur] = s[be[cur-1]-1]+dp[cur-1]+s[cur]
be[cur] = be[cur-1]-1
else:
for j in range(be[cur-1],cur+1):
if huiwen(s[j:cur+1]):
dp[cur]=s[j:cur+1]
be[cur]=j
break
for i in range(1,len(s)):
f(s,i)
maxl = dp[0]
print(dp)
for i in dp:
if len(i)>len(maxl):maxl=i
return maxl