用python输入两个字符串s1 和 s2,使用 while 循环找出s1 和s2的最长公共子序列的长度。《 def les length(s1, $2):+
时间: 2024-11-30 19:19:49 浏览: 9
python3字符串操作总结
在Python中,我们可以使用动态规划的方法来寻找两个字符串`s1`和`s2`的最长公共子序列(LCS,Longest Common Subsequence)的长度。这里我们可以通过while循环结合一个二维数组来存储已计算出的子序列长度。以下是算法步骤:
1. 创建一个空的二维列表dp,其行数和列数与两个字符串的长度相同,用于存储子问题的结果。
2. 初始化dp的第一行和第一列为0,因为一个字符串的前缀不可能是另一个字符串的子序列。
3. 使用嵌套的while循环遍历`s1`和`s2`的字符,对于每个位置i和j:
- 如果`s1`的第i个字符等于`s2`的第j个字符,则dp[i][j] = dp[i-1][j-1] + 1,意味着当前字符是共同的,所以LCS长度加1。
- 否则,dp[i][j]取两个子情况中的最大值:dp[i-1][j](不包括`s1`的当前字符)和dp[i][j-1](不包括`s2`的当前字符),表示去掉其中一个字符后的最长公共子序列长度。
4. 最终,dp[s1.length()][s2.length()]就是两个字符串的最长公共子序列的长度。
下面是对应的Python代码实现:
```python
def lcs_length(s1, s2):
m, n = len(s1), len(s2)
dp = [[0] * (n+1) for _ in range(m+1)]
i, j = 0, 0
while i < m and j < n:
if s1[i] == s2[j]:
dp[i][j] = dp[i-1][j-1] + 1
i += 1
j += 1
elif dp[i-1][j] > dp[i][j-1]: # 保留左侧的最长子序列
i += 1
else:
j += 1
return dp[m][n]
# 示例
s1 = "abcde"
s2 = "ace"
print(lcs_length(s1, s2)) # 输出结果:3
```
阅读全文