回文子序列,输入s=bbabab 输出4,s最好的回文子序列是baab,输入s= dcbccacdb 输出4 最好的回文子序列是dccd 帮我用Python的方法编写一下执行程序
时间: 2024-10-23 12:09:01 浏览: 14
回文子序列是指一个字符串中可以反转的部分,其正序和反序形式都是一样的。给定一个字符串 `s`,寻找其中最长的回文子序列。我们可以使用动态规划的方法来解决这个问题。这里是一个简单的 Python 程序:
```python
def longest_palindrome_subseq(s):
n = len(s)
# 创建一个二维列表 dp,dp[i][j] 表示 s[i:j+1] 的最长回文子序列长度
dp = [[0 for _ in range(n)] for _ in range(n)]
# 基本情况:单字符本身就是回文,长度为1
for i in range(n):
dp[i][i] = 1
# 从长度为2的子串开始计算
for length in range(2, n + 1):
for i in range(n - length + 1):
j = i + length - 1
if s[i] == s[j]: # 如果子串的第一个和最后一个字符相同
dp[i][j] = dp[i + 1][j - 1] + 2 # 则递增长度,考虑去掉首尾字符后的子序列
else:
dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]) # 否则取两边子序列的最大值
return dp[0][n - 1]
# 测试
s1 = "bbabab"
print(longest_palindrome_subseq(s1)) # 输出:4
s2 = "dcbccacdb"
print(longest_palindrome_subseq(s2)) # 输出:4
```
这个程序首先初始化一个二维数组 `dp`,然后通过遍历字符串,利用已知的子序列信息逐步计算出整个字符串的最长回文子序列的长度。
阅读全文