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


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


        基本思想是:根据字符串长度从大到小,依次找出某一字符串的子串,找到的子串和另一个字符串做匹配。如果匹配成功,当前子串就是两个字符串的最大公共子串。例如:字符串”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
    ",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);



  • 相关阅读:
    用户场景故事
    我喜欢的输入法
    课堂练习-----查找水王
    《你的灯亮着吗》阅读笔记1
    补第二阶段冲刺站立会议6(原6月8日)
    补第二阶段冲刺站立会议5(原6月7日)
    补第二阶段冲刺站立会议4(原6月6日)
    补第二次冲刺站立会议3(原6月5日)
    补第二次冲刺站立会议2(原6月4日)
    补第二次阶段冲刺站立会议1(原6月3日)
  • 原文地址:https://www.cnblogs.com/coderkl/p/4320328.html
Copyright © 2020-2023  润新知