最长公共子串

来源:互联网 发布:普拉达男包高仿淘宝店 编辑:程序博客网 时间:2024/04/29 18:46

输入两个字符串,求其中的最长公共子串。

设两个子串分别是a、b,比较简单的思路是将两个子串横纵排列对比,建立一个length(a)*length(b)的矩阵:

如a[]="123shuangshuar",b="ashuan123";对比矩阵:

遍历矩阵,碰到1则沿对角线遍历,沿对角线时若遇到0则返回,并更新公共子串长度和位置标记值。

#include <stdio.h>#include <stdlib.h>#define SIZE 1000char 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;}


测试结果:

 

 

 

 

 

原创粉丝点击