问题描述:要求输入两个字符序列,求出这两个字符序列的最长公共子序列长度,并输出最长公共子序列。 ●输入样例: ●请输入第一个字符序列:ABABCCC ●请输入第二个字符序列:BACBAAAAADC ●输出样例: ●第一个字符序列:ABABCCC ●第二个字符序列:BACBAAAAADC ●最长公共子序列长度为:5 ●最长公共子序列是BABC
时间: 2023-06-24 13:05:43 浏览: 49
这是一个经典的动态规划问题,可以使用动态规划算法解决。
首先定义状态,设 $dp[i][j]$ 表示第一个字符序列前 $i$ 个字符和第二个字符序列前 $j$ 个字符的最长公共子序列长度。则最终要求的答案为 $dp[m][n]$,其中 $m$ 和 $n$ 分别为两个字符序列的长度。
接下来考虑状态转移方程。当第一个字符序列的第 $i$ 个字符和第二个字符序列的第 $j$ 个字符相同时,即 $a[i]=b[j]$ 时,最长公共子序列中一定包含该字符,因此 $dp[i][j]=dp[i-1][j-1]+1$。
当第一个字符序列的第 $i$ 个字符和第二个字符序列的第 $j$ 个字符不同时,最长公共子序列不可能包含这两个字符,因此 $dp[i][j]$ 应该等于 $dp[i-1][j]$ 和 $dp[i][j-1]$ 中的较大值,即 $dp[i][j]=\max(dp[i-1][j],dp[i][j-1])$。
最后,根据计算出的 $dp$ 数组,可以反推出最长公共子序列。从 $dp[m][n]$ 开始向左上方遍历,如果 $a[i]=b[j]$ 则将该字符加入最长公共子序列中,并向左上方移动;否则,根据 $dp$ 数组的定义,向较大的那个方向移动。
下面是实现代码:
相关问题
编程寻找两个字符串的最长公共子序列 要求可以输入两个字符串 输出最长公共子序列以及长度
好的,以下是Python的代码实现:
```python
def lcs(str1, str2):
m = len(str1)
n = len(str2)
c = [[0 for x in range(n+1)] for y 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]:
c[i][j] = c[i-1][j-1] + 1
else:
c[i][j] = max(c[i][j-1], c[i-1][j])
result = ""
while m > 0 and n > 0:
if str1[m-1] == str2[n-1]:
result = str1[m-1] + result
m -= 1
n -= 1
elif c[m-1][n] > c[m][n-1]:
m -= 1
else:
n -= 1
return result, c[len(str1)][len(str2)]
```
函数 `lcs` 接受两个字符串 `str1` 和 `str2`,返回一个元组 `(result, length)`,其中 `result` 为最长公共子序列,`length` 为其长度。
例如,如果输入 `str1 = "ABCDGH"` 和 `str2 = "AEDFHR"`,则调用 `lcs(str1, str2)` 将返回 `("ADH", 3)`。
编程寻找两个字符串的最长公共子序列 要求可以输入两个字符串 输出最长公共子序列以及长度 同时用C++完成
好的,以下是C++的代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
void lcs(const string& str1, const string& str2, string& result, int& length) {
int m = str1.length();
int n = str2.length();
int c[m+1][n+1];
memset(c, 0, sizeof(c));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (str1[i-1] == str2[j-1]) {
c[i][j] = c[i-1][j-1] + 1;
} else {
c[i][j] = max(c[i][j-1], c[i-1][j]);
}
}
}
length = c[m][n];
while (m > 0 && n > 0) {
if (str1[m-1] == str2[n-1]) {
result = str1[m-1] + result;
m--;
n--;
} else if (c[m-1][n] > c[m][n-1]) {
m--;
} else {
n--;
}
}
}
int main() {
string str1 = "ABCDGH";
string str2 = "AEDFHR";
string result;
int length;
lcs(str1, str2, result, length);
cout << "Result: " << result << endl;
cout << "Length: " << length << endl;
return 0;
}
```
函数 `lcs` 接受两个字符串 `str1` 和 `str2`,一个字符串引用 `result` 和一个整数引用 `length`,返回值为空。
函数会将最长公共子序列存储在 `result` 中,长度存储在 `length` 中。
例如,如果输入 `str1 = "ABCDGH"` 和 `str2 = "AEDFHR"`,则调用 `lcs(str1, str2, result, length)` 将输出:
```
Result: ADH
Length: 3
```