给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
示例 1:
输入:
"bbbab"
输出:
4
一个可能的最长回文子序列为 "bbbb"。
示例 2:
输入:
"cbbd"
输出:
2
思路: 动态规划。
dp[i][j]表示索引i到j的子串是否是回文 dp[i][j] = true表示是回文,反之则为false dp[i][i]只有一个字符,必是回文 关键点在于找到关系:dp[i][j] = dp[i + 1][j - 1] && s.charAt(i) == s.charAt(j); 长的子串dp[i][j]依赖于短的子串dp[i + 1][j - 1],所以由短到长依次计算
就是说:
dp[i][j] = longest palindrome subsequence of s[i to j].
If s[i] == s[j], dp[i][j] = 2 + dp[i+1][j - 1]
Else, dp[i][j] = max(dp[i+1][j], dp[i][j-1])
按照这个思路,解法如下:
s = input() n = len(s) dp = [[0 for i in range(n)] for j in range(n)] for i in range(n-1, -1, -1): dp[i][i] = 1
for j in range(i+1, n): if s[i]==s[j]: dp[i][j] = 2+dp[i+1][j-1] else: dp[i][j] = max(dp[i+1][j], dp[i][j-1]) print(dp[0][-1])