求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计一个类String,包括一个len(字符串长度)和字符串指针s。
时间: 2024-05-16 08:14:33 浏览: 5
可以使用动态规划来解决这个问题。具体而言,我们可以定义一个二维数组dp,其中dp[i][j]表示以第一个字符串的第i个字符和第二个字符串的第j个字符为结尾的最长公共子串的长度。对于任意的i和j,如果第一个字符串的第i个字符和第二个字符串的第j个字符相同,那么我们有dp[i][j] = dp[i-1][j-1]+1,否则dp[i][j] = 0。最终的答案即为所有dp[i][j]中的最大值。
以下是代码实现:
```
#include <iostream>
#include <cstring>
using namespace std;
class String {
public:
int len;
char* s;
String() {}
String(const char* str) {
len = strlen(str);
s = new char[len];
strcpy(s, str);
}
~String() {
if (s != nullptr) {
delete[] s;
}
}
};
void longestCommonSubstring(String& s1, String& s2) {
int** dp = new int*[s1.len + 1];
for (int i = 0; i <= s1.len; i++) {
dp[i] = new int[s2.len + 1];
memset(dp[i], 0, (s2.len + 1) * sizeof(int));
}
int maxLen = 0;
int endIndex = -1;
for (int i = 1; i <= s1.len; i++) {
for (int j = 1; j <= s2.len; j++) {
if (s1.s[i - 1] == s2.s[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > maxLen) {
maxLen = dp[i][j];
endIndex = i - 1;
}
}
}
}
if (endIndex == -1) {
cout << "没有公共子串" << endl;
} else {
cout << "最长公共子串为:" << endl;
for (int i = endIndex - maxLen + 1; i <= endIndex; i++) {
cout << s1.s[i];
}
cout << endl;
cout << "长度为:" << maxLen << endl;
}
for (int i = 0; i <= s1.len; i++) {
delete[] dp[i];
}
delete[] dp;
}
int main() {
String s1("abcdefg");
String s2("bcdefgh");
longestCommonSubstring(s1, s2);
return 0;
}
```
上述代码的输出结果为:
```
最长公共子串为:
bcdefg
长度为:6
```