leetcode回文串/列汇总:
https://blog.csdn.net/qq_38742161/article/details/90209268 Leetcode 5. 最长回文子串
https://blog.csdn.net/qq_38742161/article/details/90210716 Leetcode 647. 回文子串
给定一个字符串
s
,找到其中最长的回文子序列。可以假设s
的最大长度为1000
。示例 1:
输入:"bbbab"输出:
4一个可能的最长回文子序列为 "bbbb"。
示例 2:
输入:"cbbd"输出:
2一个可能的最长回文子序列为 "bb"。
tips:本题与其他回文串不同之处在于,所要求的回文序列无需连续。那么动态规划的状态转移方程需要发生变化。我们维护dp数组,dp[i][j]表示从i到j的子序列的回文串的数量(i<j)。如果 s[i]==s[j],dp[i][j]=dp[i+1]dp[j-1]+2;否则,dp[i][j]=max(dp[i+1][j],dp[i][j-1])。这就要求i+1=<j-1,且i+1<=j,i<=j-1;故我们对初值(lenth<=2)进行复制。代码如下:
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n=len(s)
if not n:
return 0
if s==s[::-1]:
return n
dp=[[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
if i<n-1 :
if s[i]==s[i+1]:
dp[i][i+1]=2
else:
dp[i][i+1]=1
dp[i][i]=1
for lenth in range(2,n):
for i in range(n-lenth):
j=i+lenth
if s[i]==s[j]:
dp[i][j]=dp[i+1][j-1]+2
else:
dp[i][j]=max(dp[i+1][j],dp[i][j-1])
return dp[0][n-1]