python题目1:查找最长公共子序列请编写一个python函数,接受两个字符串作为参数,返回这两个字符串的最长公共子序列。如果不存在公共子序列,则返回空字符串。示例输入:str1 = \abcdgh\"str2 = \"aedfhr\"示例输出:\"adh"
时间: 2023-08-09 18:02:29 浏览: 100
查询两个字符串的最长公共子序列
要实现查找最长公共子序列的功能,我们可以使用动态规划的方法。
首先,创建一个二维数组dp,用来保存最长公共子序列的长度。数组dp的大小为(len(str1)+1)×(len(str2)+1),其中dp[i][j]表示str1的前i个字符和str2的前j个字符的最长公共子序列的长度。
接下来,我们用两个for循环来遍历str1和str2中的所有字符。当str1的第i个字符和str2的第j个字符相同时,dp[i][j]等于dp[i-1][j-1]+1,表示最长公共子序列的长度增加了1。否则,dp[i][j]等于max(dp[i][j-1], dp[i-1][j]),表示继承前一个位置的最长公共子序列的长度。
最后,要构建最长公共子序列,我们可以从dp[len(str1)][len(str2)]开始,根据dp数组的值逆序遍历str1和str2,如果当前位置的字符相同,就将字符添加到结果字符串中。
具体的代码如下所示:
```python
def longest_common_subsequence(str1, str2):
len1 = len(str1)
len2 = len(str2)
dp = [[0] * (len2 + 1) for _ in range(len1 + 1)]
for i in range(1, len1+1):
for j in range(1, len2+1):
if str1[i-1] == str2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i][j-1], dp[i-1][j])
result = ''
i, j = len1, len2
while i > 0 and j > 0:
if str1[i-1] == str2[j-1]:
result = str1[i-1] + result
i -= 1
j -= 1
elif dp[i][j-1] > dp[i-1][j]:
j -= 1
else:
i -= 1
return result
```
使用示例:
```python
str1 = "abcdgh"
str2 = "aedfhr"
result = longest_common_subsequence(str1, str2)
print(result)
```
该代码的输出为"adh",符合题目要求。如果不存在公共子序列,则返回空字符串。
阅读全文