最长回文子串


给定一个字符串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])

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM