# @lc code=start classSolution: deflongestPalindromeSubseq(self, s: str) -> int: n=len(s) dp=[[0for _ inrange(n)] for _ inrange(n)] for i inrange(n): dp[i][i]=1
for i inrange(n-1,-1,-1): for j inrange(i+1, n): 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] # @lc code=end
参考思路:《算法小抄》2.8
使用状态压缩
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: deflongestPalindromeSubseq(self, s: str) -> int: n=len(s) dp=[1for _ inrange(n)] for i inrange(n-2, -1, -1): pre=0 for j inrange(i+1, n): temp=dp[j] if s[i]==s[j]: dp[j]=pre+2 else: dp[j]=max(dp[j], dp[j-1]) pre=temp return dp[n-1]