求两个字符串的最大公共子串

    求连个字符串的最大公共子串有很多种方法,本文将尝试用穷举的方法得到两个字符串的最大公共子串。


    基本思想是:根据字符串长度从大到小,依次找出某一字符串的子串,找到的子串和另一个字符串做匹配。如果匹配成功,当前子串就是两个字符串的最大公共子串。例如:字符串”abcdef” ,按长度从大到小,其子串分别为

  “abcdef”

  “abcde”  “bcdef” 

  “abcd”  “bcde”  “cdef”

  “abc”  “bcd”  “cde” “def”

  “ab”  “bc”  “cd”  “de” “ef”

  “a”  “b”  “c” “d”  “e”  “f”

    用到的库函数有:

     strlen()   //求字符串的长度

     strcpy()   //字符串拷贝

     strstr()    //查找串sStr 在串lStr 中首次出现的位置,返回指向该位置的指针,找不到匹配则返回空指针


#include <stdio.h>
#include <string.h>
#define MAXSIZE 100

int isMatch(char *sStr,char *lStr);
void getLcs(char *sStr,char *lStr);

//全局变量存放最大公共子串
char longestCommonSubstr[MAXSIZE];
int main()
{
    char *s=longestCommonSubstr;
    char *s1="abcdefgh";
    char *s2="acefg";

    getLcs(s2,s1);

    printf("%s\n",s);
    return 0;
}

//参数中字符串顺序不会影响函数实现,
//建议把短字符串放前面,提高性能
void getLcs(char *sStr,char *lStr)
{
    int len=(int)strlen(sStr);  //母串长度
    int i;  //子串长度
    int j;  //子串个数  i+j==len+1
    int k;  //子串首字符在母串中下标
    int m;  //计数器
    for(i=len;i>0;i--)
    {
        for(j=1;j<=len-i+1;j++)
        {
            for(k=0;k<j;k++)
            {
                char str[MAXSIZE];
                for(m=0;m<i;m++)
                {
                    str[m]=sStr[k+m];
                }
                str[i]=0;  //得到子串

                if(isMatch(str,lStr))
                {
                    strcpy(longestCommonSubstr,str);
                    return;
                }
            }
        }

    }
    char failGet[]="没有公共子串";
    strcpy(longestCommonSubstr,failGet);
    return;
}

int isMatch(char *sStr,char *lStr)
{
    //查找串sStr 在串lStr 中首次出现的位置,返回指向该位置的指针
    //找不到匹配则返回空指针
    char *p = strstr(lStr,sStr);
    if(p == NULL)
        return 0;
    return 1;
}



使用说明:

   函数getLcs()  两个参数顺序不会影响函数实现,但是为了提高性能,建议把短字符串放前面。

  当有多个最大公共子串时,只能输出前面(从左到右顺序)第一个子串。后续可改进为全部输出。

 

 *    本程序不适用于多个字符串求最大公共子串,以下情况时,程序会失效:

 *    char *s1="abcdefgh";

 *    char *s2="abcefg";

 *    char *s3="ef";

 *    getLps(s1,s2);

 *    getLps(s, s3);



posted @ 2014-08-13 10:42  coderkl  阅读(969)  评论(0编辑  收藏  举报