A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁胜平 中级黑马   /  2015-4-11 13:32  /  430 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)

#include <string.h>

void checknext(char *s1, char *s2, int i, int j, int *m); // 声明
void getPublicStr(char *str1, char *str2); // 声明

int  main()
{
   
    char *s1 = "nihaoheimahlovetmanb";
    char *s2 = "nihaoheimaitgdfgsteia";
   
   
    getPublicStr(s1,s2);
   
    return 0;
}

void checknext(char *s1, char *s2, int i, int j, int *m)
{
    if(s2[i+1]==s1[j+1]&&s2[i+1]!='\0'&&s1[j+1]!='\0')
    {
        (*m)++; // 通过指针给长度+1
        checknext(s1,s2,i+1,j+1,m); //递归查找下一个相同的字符
    }
}

void getPublicStr(char *str1, char *str2)
{
    int max = 0, start = 0, length=0; // 定义最大长度,开始下标,匹配长度
    char *longstring;char *shortstring; // 定义较长字符串和较短字符串
   
   
    if(strlen(str1)<strlen(str2))     // 将较长字符串赋给longstring,短字符串赋给shortstring
    {
        longstring = str2; shortstring = str1;
    }
    else
    {
        longstring = str1; shortstring = str2;
    }
   
    // 遍历
    for(int i=0;i<strlen(longstring);i++)
    {
        for(int j=0;j<strlen(shortstring);j++)
        {
            //取出shortstring的每一个元素与longstring进行比较
            if(longstring[i]==shortstring[j])
            {
                length=1;
                checknext(longstring,shortstring,i,j,&length);//  首次执行完后获得第一个匹配字符串长度
            }
            
            if(length>max)
            {max=length; start=i;} //如果长度大于最大长度,则保存最大值
        }
    }
   
    if(max == 0)
    {
        printf("没有找到最大公共字符串\n");
    }
    else
    {
        printf("最大公共字符串是:");
        for(int k=start;k<(max+start);k++)
        {
            printf("%c",longstring[k]); // 循环输出最大公共字符串
        }
        printf("\n");
    }
}



1 个回复

倒序浏览
谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马