最长公共子序列的长度
时间: 2023-12-18 12:27:47 浏览: 78
最长公共子序列
最长公共子序列是指在两个序列中都出现的最长的子序列(可以不连续)。最长公共子序列的长度是指这个子序列中元素的个数。求最长公共子序列的长度是一类经典的问题,在动态规划中有广泛的应用。
以下是三种求最长公共子序列长度的方法:
1.递归定义最优值
2.递归加备忘录
3.动态规划
Python代码如下:
```python
# 递归定义最优值
def lcs_length(s1, s2):
if not s1 or not s2:
return 0
if s1[-1] == s2[-1]:
return lcs_length(s1[:-1], s2[:-1]) + 1
else:
return max(lcs_length(s1[:-1], s2), lcs_length(s1, s2[:-1]))
# 递归加备忘录
def lcs_length_memo(s1, s2, memo):
if (s1, s2) in memo:
return memo[(s1, s2)]
if not s1 or not s2:
memo[(s1, s2)] = 0
return 0
if s1[-1] == s2[-1]:
memo[(s1, s2)] = lcs_length_memo(s1[:-1], s2[:-1], memo) + 1
return memo[(s1, s2)]
else:
memo[(s1, s2)] = max(lcs_length_memo(s1[:-1], s2, memo), lcs_length_memo(s1, s2[:-1], memo))
return memo[(s1, s2)]
# 动态规划
def lcs_length_dp(s1, s2):
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ 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]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return dp[m][n]
```
阅读全文