c语言输出最长公共子串
时间: 2023-12-15 08:01:31 浏览: 89
最长公共子串是指两个字符串中最长的相同部分,可以用动态规划的方法来求解。首先,我们可以定义一个二维数组来存储两个字符串中每个位置的公共子串的长度,然后利用动态规划的思想逐步填充数组。
首先,我们定义一个二维数组dp,dp[i][j]表示以字符串1的第i个字符和字符串2的第j个字符结尾的公共子串的长度。然后可以用以下动态规划的方法来填充dp数组:
如果字符串1的第i个字符和字符串2的第j个字符相等,那么dp[i][j] = dp[i-1][j-1] + 1
如果字符串1的第i个字符和字符串2的第j个字符不相等,那么dp[i][j] = 0
最后,我们可以在填充dp数组的过程中记录最长的公共子串的长度以及它在两个字符串中的位置,最后输出这个最长公共子串。
下面是c语言代码示例:
```c
#include <stdio.h>
#include <string.h>
void longestCommonSubstring(char* str1, char* str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int dp[len1+1][len2+1];
int maxLen = 0;
int endPos = 0;
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= len1; i++) {
for(int j = 1; j <= len2; j++) {
if(str1[i-1] == str2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
if(dp[i][j] > maxLen) {
maxLen = dp[i][j];
endPos = i-1;
}
}
}
}
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[] = "abcdefg";
char str2[] = "cdefg";
longestCommonSubstring(str1, str2);
return 0;
}
```
通过上面的c语言代码示例,我们可以输出最长公共子串,对于输入的两个字符串"abcdefg"和"cdefg",最长公共子串为"cdefg"。
阅读全文