解决最长公共子序列问题。输入的字符串可以利用随机数生成器随机产生,运行程序,记录对长度为一千、一万、十万的字符串,查找公共子序列所用的时间,列出表格显示。并单独显示一个长度为一百的字符串查找最长公共子序列的结果。用C++解决
时间: 2024-02-25 22:55:51 浏览: 69
好的,我会为您解答这个问题。针对最长公共子序列问题,可以使用动态规划算法进行求解。具体步骤如下:
1. 定义状态:设字符串A和B的长度分别为m和n,令dp[i][j]表示A中前i个字符和B中前j个字符的最长公共子序列的长度。
2. 状态转移方程:当A[i-1]等于B[j-1]时,dp[i][j] = dp[i-1][j-1] + 1;否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
3. 边界条件:当i=0或j=0时,dp[i][j] = 0。
4. 最终结果:dp[m][n]即为A和B的最长公共子序列的长度。
下面是C++代码实现:
```cpp
#include <iostream>
#include <cstring>
#include <ctime>
using namespace std;
const int MAXN = 1e5 + 5;
int dp[MAXN][MAXN];
string generateString(int n) {
string str = "";
for (int i = 0; i < n; i++) {
str += (char) (rand() % 26 + 'a');
}
return str;
}
int LCS(string A, string B) {
int m = A.length(), n = B.length();
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (A[i-1] == B[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];
}
int main() {
srand(time(0));
int n1 = 1000, n2 = 10000, n3 = 100000;
string str1 = generateString(n1);
string str2 = generateString(n2);
string str3 = generateString(n3);
clock_t start, end;
cout << "长度为1000的字符串查找最长公共子序列的结果:" << endl;
cout << LCS(str1.substr(0, 100), str1.substr(100, 100)) << endl;
cout << "长度为1000、10000、100000的字符串查找公共子序列所用的时间:" << endl;
start = clock();
LCS(str1, str1);
end = clock();
cout << "长度为1000,用时:" << (double) (end - start) / CLOCKS_PER_SEC << "秒" << endl;
start = clock();
LCS(str2, str2);
end = clock();
cout << "长度为10000,用时:" << (double) (end - start) / CLOCKS_PER_SEC << "秒" << endl;
start = clock();
LCS(str3, str3);
end = clock();
cout << "长度为100000,用时:" << (double) (end - start) / CLOCKS_PER_SEC << "秒" << endl;
return 0;
}
```
在程序中,首先使用generateString函数生成长度为n1、n2、n3的三个字符串,然后分别计算它们的最长公共子序列,最后输出对应的用时。注意,在计算长度为1000的字符串的最长公共子序列时,只考虑前200个字符即可。
希望对您有所帮助!
阅读全文