516. 最长回文子序列(Python)

Python015

516. 最长回文子序列(Python),第1张

难度:★★★☆☆

类型:字符串

方法:动态规划

力扣链接请移步 本题传送门

更多力扣中等题的解决方案请移步 力扣中等题目录

给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。

示例 1:

输入:

"bbbab"

输出:

4

一个可能的最长回文子序列为 "bbbb"。

示例 2:

输入:

"cbbd"

输出:

2

一个可能的最长回文子序列为 "bb"。

提示:

1 <= s.length <= 1000

s 只包含小写英文字母

这道题使用动态规划来做。

定义:设输入字符串s的长度为n,设dp矩阵为nxn维,dp[i][j]表示以下标i开始,以下标j结尾的子串中最长回文子序列的长度。i<=j

初始化:设置dp矩阵为对角阵,即对角线处的所有元素为1,其他元素填充为0,因为当i=j时,选中的子串只包含一个字符。

递推公式:分两种情况,

第一,从下标i+1到j-1的串左右两头均各增加一个字符,如果新增的两个字符一致,也就是s[i]==s[j],那么将从下标i+1到j-1的串对应的最长回文子序列的长度加2即可,也就是dp[i][j]=dp[i+1]dp[j-1]+2

第二,如果新增的两个字符不等,也就是s[i]!=s[j],那么选取dp[i+1][j]和dp[i][j-1]中更大的数作为dp[i][j]即可。

这里需要注意的是,为了保证每次递推都可以取到该有的值,外层遍历应该逆序,内层遍历应该顺序进行。

返回值:最终返回dp[0][n-1]即可。

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步 力扣中等题解析

1、有时候我们可能想让字符串倒序输出,下面给出几种方法

方法一:通过索引的方法

[python] view plain copy print?

>>>strA = "abcdegfgijlk"

>>>strA[::-1]

'kljigfgedcba'

方法二:借组列表进行翻转

[python] view plain copy print?

#coding=utf-8

strA = raw_input("请输入需要翻转的字符串:")

order = []

for i in strA:

order.append(i)

order.reverse() #将列表反转

print ''.join(order)#将list转换成字符串

执行结果:

[python] view plain copy print?

请输入需要翻转的字符串:abcdeggsdd

ddsggedcba

(1)遍历key值

在使用上,for key in a和 for key in a.keys():完全等价。

(2)遍历value值

(3)遍历字典项

(4)遍历字典健值

在使用上for key,value in a.items()与for (key,value) in a.items()完全等价