一、递归(dfs和回溯)遍历写法的思考
二、最长回文子序列
1、正确写法
注意这里pre需放在外层for循环的里面,是由于在二维数组中对角线左侧的值均为0,由于j是从i+1开始,需从对角线的右侧更新temp值;若没有在对角线右侧,则pre=0。
由于j=i+1,下一次外层循环中的内层循环是更新dp[j+1],而不是更新dp[j],故pre还是上一次外层循环的dp[j-1],(这一次的外层循环并没有更新dp[j-1],因为是从j开始更新的)。
①对dp[j]赋新值之前,dp[j]的值是外层for循环上一次迭代算出来的值,对应二维dp数组中dp[i+1][j]的位置。
②dp[j-1]的值就是内层 for 循环上一次迭代算出来的值,对应二维dp数组中dp[i][j-1]的位置
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n=len(s)
dp =[1]*n
res=[]
for i in range(n-2,-1,-1):
print('------------------')
pre=0
for j in range(i+1,n):
temp = dp[j]
print("第{}层的temp:{}为{}".format(i,j,temp))
if s[i]==s[j]:
print("***i{}层索引为{}的pre为{}".format(i+1,j-1,pre))
dp[j]=pre+2
else:
dp[j] = max(dp[j],dp[j-1])
pre=temp
print("____dp[{}][{}]为pre{}".format(i,j,pre))
return dp[n-1]
if __name__=="__main__":
Solution().longestPalindromeSubseq("bbbab")
2、错误写法
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n=len(s)
dp =[1]*n
res=[]
pre=0
for i in range(n-2,-1,-1):
print('------------------')
for j in range(i+1,n):
temp = dp[j]
print("第{}层的temp:{}为{}".format(i,j,temp))
if s[i]==s[j]:
print("***i{}层索引为{}的pre为{}".format(i+1,j-1,pre))
dp[j]=pre+2
else:
dp[j] = max(dp[j],dp[j-1])
pre=temp
print("____dp[{}][{}]为pre{}".format(i,j,pre))
return dp[n-1]
if __name__=="__main__":
Solution().longestPalindromeSubseq("bbbab")