什么是公共子串呢?For example,对于abcdefg与aaabcddefgefg,有多个相同的子序列,例如abcd,defg,efg,那就输出abcd(如果子序列长度相等,输出先出现的)哈哈,很简单吧,那就解决它吧。c语言
时间: 2023-06-12 10:08:22 浏览: 131
面试必考字符串相关的动态规划——最大公共子序列、最大公共子串、编辑距离
好的,让我们来解决这个问题。我们可以使用动态规划来找到这些公共子串。具体来说,我们可以创建一个二维数组dp,其中dp[i][j]表示以第一个字符串的第i个字符和第二个字符串的第j个字符为结尾的公共子串的长度。那么,当我们遍历两个字符串时,如果第i个字符和第j个字符相同,那么dp[i][j]就是dp[i-1][j-1]+1;否则,dp[i][j]为0。最后,我们只需要找到dp数组中的最大值,就是最长的公共子串的长度了。
接下来是C语言的代码实现:
```c
#include <stdio.h>
#include <string.h>
void findLongestCommonSubstring(char *s1, char *s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
int dp[len1][len2];
int maxlen = 0;
int endpos = 0;
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
if (s1[i] == s2[j]) {
if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
} else {
dp[i][j] = 0;
}
if (dp[i][j] > maxlen) {
maxlen = dp[i][j];
endpos = i;
}
}
}
if (maxlen == 0) {
printf("No common substring found.\n");
return;
}
printf("Longest common substring is: ");
for (int i = endpos - maxlen + 1; i <= endpos; i++) {
printf("%c", s1[i]);
}
printf("\n");
}
int main() {
char s1[] = "abcdefg";
char s2[] = "aaabcddefgefg";
findLongestCommonSubstring(s1, s2);
return 0;
}
```
运行结果为:
```
Longest common substring is: defg
```
其中,我们使用了两个变量maxlen和endpos,分别表示最长公共子串的长度和在第一个字符串中的结尾位置。在找到每个dp[i][j]的值之后,我们判断是否比之前的最大值更大,如果是,就更新maxlen和endpos的值。最后,我们在第一个字符串中输出最长公共子串即可。
阅读全文