输入两个字符串,求公共子串,用c++实现,尽可能使时间复杂度和空间复杂度小
时间: 2023-05-20 18:02:58 浏览: 101
可以使用动态规划算法来解决这个问题。具体步骤如下:
1. 定义一个二维数组dp,dp[i][j]表示以第一个字符串的第i个字符和第二个字符串的第j个字符结尾的公共子串的长度。
2. 初始化dp数组,将dp[i][j]都赋值为0。
3. 遍历两个字符串,如果第一个字符串的第i个字符和第二个字符串的第j个字符相等,则dp[i][j] = dp[i-1][j-1] + 1。
4. 在遍历过程中,记录最长的公共子串的长度和结束位置。
5. 最后根据最长公共子串的长度和结束位置,可以得到公共子串。
时间复杂度为O(n^2),空间复杂度为O(n^2)。
以下是C语言实现的代码:
```
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
int main()
{
char str1[MAXLEN], str2[MAXLEN];
int dp[MAXLEN][MAXLEN] = {0};
int len1, len2, maxLen = 0, endPos = 0;
printf("请输入第一个字符串:");
scanf("%s", str1);
printf("请输入第二个字符串:");
scanf("%s", str2);
len1 = strlen(str1);
len2 = strlen(str2);
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
if (str1[i] == str2[j])
{
if (i == 0 || j == 0)
{
dp[i][j] = 1;
}
else
{
dp[i][j] = dp[i-1][j-1] + 1;
}
if (dp[i][j] > maxLen)
{
maxLen = dp[i][j];
endPos = i;
}
}
}
}
if (maxLen == 0)
{
printf("没有公共子串!\n");
}
else
{
printf("最长公共子串为:");
for (int i = endPos - maxLen + 1; i <= endPos; i++)
{
printf("%c", str1[i]);
}
printf("\n");
}
return 0;
}
```
阅读全文