输入两个字符串,求其中的最长公共子串。
设两个子串分别是a、b,比较简单的思路是将两个子串横纵排列对比,建立一个length(a)*length(b)的矩阵:
如a[]="123shuangshuar",b="ashuan123";对比矩阵:
遍历矩阵,碰到1则沿对角线遍历,沿对角线时若遇到0则返回,并更新公共子串长度和位置标记值。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 1000
char a[SIZE];
char b[SIZE];
int length(char *m)
{
int Length = 0;
int i=0;
while(m[i]!='\0')
{
Length++;
i++;
}
return Length;
}
int main()
{
scanf("%s%s",a,b);
int c = length(a);
int d = length(b);
int e[c][d];
int i,j;
for(i=0;i<c;i++)
for(j=0;j<d;j++)
{
if(a[i] == b[j])
e[i][j] = 1;
else e[i][j] = 0;
}
int mark = -1;
int ok = 0;
for(i=0;i<c;i++)
for(j=0;j<d;j++)
{
int r = i;
int s = j;
int temp = 0;
while((e[r][s] == 1)&&(r<c)&&(s<d))
{
temp++;
r += 1;
s += 1;
}
if(temp > ok)
{
ok = temp;
mark = j;
}
}
if(mark == -1)
return -1;
printf("最长公共子串是:\n");
for(i=mark;i<mark+ok;i++)
printf("%c",b[i]);
return 0;
}
测试结果: