小明有两个字符串,他想找出其中最长的公共连续子串的长度,希望你能帮助他。例如,两个字符串分别为“abcde”和“abdge”,结果为2。c语言
时间: 2023-08-31 16:21:42 浏览: 83
C语言求两个字符串的最长公共子串
5星 · 资源好评率100%
### 回答1:
实现如下:
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
int main() {
char str1[MAXLEN], str2[MAXLEN];
int len1, len2, i, j, k, maxLen = 0;
int dp[MAXLEN][MAXLEN] = {0}; // dp[i][j]表示以str1[i]和str2[j]结尾的最长公共连续子串长度
printf("请输入第一个字符串:");
scanf("%s", str1);
printf("请输入第二个字符串:");
scanf("%s", str2);
len1 = strlen(str1);
len2 = strlen(str2);
for (i = 0; i < len1; i++) {
for (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];
}
}
}
}
printf("最长公共连续子串的长度为:%d\n", maxLen);
return 0;
}
### 回答2:
要找出两个字符串最长的公共连续子串的长度,可以使用动态规划的方法来解决。假设两个字符串分别为str1和str2。
首先,我们创建一个二维数组dp,用于存储中间结果,其中dp[i][j]表示以str1[i]和str2[j]结尾的最长公共连续子串的长度。初始化dp数组为0。
接下来,我们遍历str1和str2的每个字符,比较当前字符是否相同。如果相同,说明可以延长公共连续子串的长度,此时更新dp数组,并记录当前的最长子串长度。具体步骤如下:
遍历str1和str2的每个字符:
- 如果str1[i]等于str2[j],说明找到了一个公共字符,可以延长公共连续子串的长度。此时,dp[i][j] = dp[i-1][j-1] + 1。
- 如果str1[i]不等于str2[j],说明当前字符不相同,公共连续子串中断,此时dp[i][j] = 0。
- 记录当前的最长子串长度max_length。
遍历完整个str1和str2之后,最长的公共连续子串的长度即为max_length。
以下是使用C语言实现的代码:
```c
#include <stdio.h>
#include <string.h>
int maxCommonSubstring(char* str1, char* str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int max_length = 0;
int dp[len1][len2];
memset(dp, 0, sizeof(dp));
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] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = 1;
}
if (dp[i][j] > max_length) {
max_length = dp[i][j];
}
}
}
}
return max_length;
}
int main() {
char str1[] = "abcde";
char str2[] = "abdge";
int maxLen = maxCommonSubstring(str1, str2);
printf("最长公共连续子串的长度:%d\n", maxLen);
return 0;
}
```
以上代码输出为2,符合题目要求。希望对你有帮助!
### 回答3:
要找出两个字符串中最长的公共连续子串的长度,可以通过动态规划的方法解决。
首先,我们可以定义一个二维数组dp[m][n]来表示两个字符串s1和s2的前m个字符和前n个字符之间的最长公共连续子串的长度。其中,m和n分别是s1和s2的长度。
然后,我们可以根据字符串s1和s2的字符逐个比较来填充dp数组。具体的填充方法如下:
当s1[i-1]等于s2[j-1]时,表示s1的第i个字符和s2的第j个字符相等,可以构成连续子串。因此,dp[i][j]可以通过dp[i-1][j-1]加1得到:dp[i][j] = dp[i-1][j-1] + 1。
当s1[i-1]不等于s2[j-1]时,表示s1的第i个字符和s2的第j个字符不相等,无法构成连续子串。因此,dp[i][j]为0。
最后,我们可以遍历dp数组,找出其中的最大值,即为最长公共连续子串的长度。
以下是相应的C语言代码示例:
```c
#include<stdio.h>
#include<string.h>
int max(int a, int b) {
return a > b ? a : b;
}
int longestCommonSubstring(char* s1, char* s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
int dp[len1+1][len2+1];
int maxLen = 0;
memset(dp, 0, sizeof(dp)); // 初始化dp数组为0
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
maxLen = max(maxLen, dp[i][j]); // 更新最大连续子串长度
} else {
dp[i][j] = 0;
}
}
}
return maxLen;
}
int main() {
char s1[] = "abcde";
char s2[] = "abdge";
int result = longestCommonSubstring(s1, s2);
printf("最长公共连续子串的长度为:%d\n", result);
return 0;
}
```
通过以上的代码,我们可以得到字符串"abcde"和"abdge"的最长公共连续子串的长度为2。
阅读全文