用动态规划算法求最长公共子序列的代码; 用递归算法求最长公共子序列的代码;
时间: 2024-04-08 13:35:29 浏览: 103
以下是使用动态规划算法和递归算法求解最长公共子序列问题的代码示例:
动态规划算法代码示例:
```python
def longest_common_subsequence(str1, str2):
m, n = len(str1), len(str2)
dp = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if str1[i-1] == str2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
# 回溯获取最长公共子序列
lcs = []
i, j = m, n
while i > 0 and j > 0:
if str1[i-1] == str2[j-1]:
lcs.append(str1[i-1])
i -= 1
j -= 1
elif dp[i-1][j] > dp[i][j-1]:
i -= 1
else:
j -= 1
return ''.join(reversed(lcs))
str1 = "ABCBDAB"
str2 = "BDCAB"
print(longest_common_subsequence(str1, str2))
```
递归算法代码示例:
```python
def longest_common_subsequence(str1, str2, m, n):
if m == 0 or n == 0:
return ""
elif str1[m-1] == str2[n-1]:
return longest_common_subsequence(str1, str2, m-1, n-1) + str1[m-1]
else:
lcs1 = longest_common_subsequence(str1, str2, m-1, n)
lcs2 = longest_common_subsequence(str1, str2, m, n-1)
return lcs1 if len(lcs1) > len(lcs2) else lcs2
str1 = "ABCBDAB"
str2 = "BDCAB"
m = len(str1)
n = len(str2)
print(longest_common_subsequence(str1, str2, m, n))
```
这两个代码示例分别展示了使用动态规划算法和递归算法求解最长公共子序列问题的方法。请注意,递归算法在处理较大规模的问题时可能会遇到效率问题,因此在实际应用中可能需要结合记忆化搜索等技术进行优化。
阅读全文