查找两个字符串中的最大公共子串 用C语言实现
时间: 2023-05-20 15:01:03 浏览: 127
一些C语言中字符串的算法问题解决实例小结
你可以使用动态规划算法来解决这个问题。具体步骤如下:
1. 定义一个二维数组dp,其中dp[i][j]表示以第一个字符串的第i个字符和第二个字符串的第j个字符结尾的最长公共子串的长度。
2. 初始化dp数组,将所有元素都赋值为0。
3. 遍历两个字符串,如果第一个字符串的第i个字符和第二个字符串的第j个字符相等,则dp[i][j] = dp[i-1][j-1] + 1,否则dp[i][j] = 0。
4. 在遍历过程中记录最长公共子串的长度和结束位置。
5. 根据最长公共子串的长度和结束位置,可以得到最长公共子串。
下面是C语言实现的代码:
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void findLCS(char *str1, char *str2)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
int dp[MAX_LEN][MAX_LEN] = {0};
int maxLen = 0, endPos = 0;
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("No common substring found.\n");
} else {
printf("The longest common substring is: ");
for (int i = endPos - maxLen + 1; i <= endPos; i++) {
printf("%c", str1[i]);
}
printf("\n");
}
}
int main()
{
char str1[MAX_LEN], str2[MAX_LEN];
printf("Please input two strings:\n");
scanf("%s%s", str1, str2);
findLCS(str1, str2);
return 0;
}
阅读全文