动态规划法求解最长公共子序列问题的算法实现
时间: 2023-06-17 14:07:43 浏览: 162
最长公共子序列的动态规划算法
最长公共子序列问题是指:给定两个序列S1和S2,求它们的最长公共子序列。最长公共子序列是指在两个或多个序列中以相同顺序出现的最长的子序列。
动态规划求解最长公共子序列问题的算法实现如下:
1. 定义状态:设f[i][j]为S1的前i个字符和S2的前j个字符的最长公共子序列的长度。
2. 初始化状态:f[i][0]=0, f[0][j]=0,即当S1和S2的其中一个序列为空时,它们的最长公共子序列的长度为0。
3. 状态转移方程:
当S1[i]=S2[j]时:f[i][j]=f[i-1][j-1]+1
当S1[i]!=S2[j]时:f[i][j]=max(f[i-1][j],f[i][j-1])
4. 求解最优解:f[n][m]即为S1和S2的最长公共子序列的长度。
5. 求解最长公共子序列:从f[n][m]开始,根据状态转移方程反推得到最长公共子序列。
以下是Python代码实现:
```python
def lcs(s1, s2):
m, n = len(s1), len(s2)
# 初始化状态矩阵
f = [[0] * (n + 1) for i in range(m + 1)]
# 状态转移
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i - 1] == s2[j - 1]:
f[i][j] = f[i - 1][j - 1] + 1
else:
f[i][j] = max(f[i - 1][j], f[i][j - 1])
# 求解最长公共子序列
ans = ''
i, j = m, n
while i > 0 and j > 0:
if s1[i - 1] == s2[j - 1]:
ans = s1[i - 1] + ans
i -= 1
j -= 1
elif f[i - 1][j] > f[i][j - 1]:
i -= 1
else:
j -= 1
return ans
```
其中,s1和s2为两个字符串,返回值为它们的最长公共子序列。
阅读全文