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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始



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

#include <stdio.h>
#include <string.h>
int  main()
{
   
    char *s1 = "nbitheimanbcf";
    char *s2 = "itheia";
   
    void maxPublicString(char *s1,char *s2);
    maxPublicString(s2,s1);
   
    return 0;
}
void maxPublicString(char *s1,char *s2)
{
    //分别求出s1,s2字符串的长度
    int s1len = strlen(s1);
    int s2len = strlen(s2);
   
    //记录相同元素下标,记录相同的元素个数
    int index = 0 ,count = 0;
   
    //遍历s1
    for(int i = 0; i<s1len ; i++)
    {
        
        //遍历s2
        for(int j = 0; j<s2len; j++)
        {
            
            //取出s2的每一个元素s1进行比较,
            if(s1[i]==s2[j])
            {
                //如果有相同的元素,则同时都往后面移动
                for(int k = 1 ;s1[i+k]==s2[j+k] && s2[j+k]!='\0' && s1[i+k]!='\0' ;k++)
                {
                    //选出最大公共字符串
                    if(k>count)
                    {
                        //记录最大公共字符串长度的下标
                        count =k;
                        
                        //记录最大公共字符串长度的个数
                        index = i;
                        
                    }
                }
            }
            
        }
    }
    if(count == 0)
    {
        printf("没有找到最大公共子串\n");
    }
    else
    {
        printf("最长公共字串是:");
        
        for(int i = 0 ; i<=count; i++)
        {
            printf("%c",s1[index+i]);
        }
    }
    printf("\n");
   
}

5 个回复

倒序浏览
你不说你哪里不懂,想帮也帮不了啊...总不可能从#include开始跟你讲头文件吧
回复 使用道具 举报
本帖最后由 alotofleo2 于 2016-3-18 02:46 编辑

                        //记录最大公共字符串长度的下标
                             index = i
                        //记录最大公共字符串长度的个数
                           count = k
这个注释应该是写反了 ,这样应该才是对的 ,这样你应该看的懂了

回复 使用道具 举报
本帖最后由 wanghui001001 于 2016-3-23 11:04 编辑

#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    char ch[10],ch1[10];
    printf("请输入两个字符串1:");
    scanf("%s",ch);
    printf("请输入两个字符串2:");
    scanf("%s",ch1);
    for (int i = 0; i < strlen(ch); i++) {
            if (ch == ch1) {
                printf("%c",ch);
                break;
        }else{
          printf("没有公共字符串")
}
    }
   
    printf("\n");
    return 0;
}



看下我的,也能运行出来结果,有什么弊端和bug嘛?求指教

回复 使用道具 举报
楼上没有理解这个题意,首先是子串,其次是公共子串,最后才是最大公共子串!楼上如果把测试用例改一下,你就输出错误答案,如:
nbitheimanb”和“itiheia”的最大子串是:"hei”
我隐隐感觉这道题有点动态规划算法的影子……
回复 使用道具 举报
题主的方法是穷举法,正确。我看了书籍,动态规划里讲的是最大公共子序列,和最大公共子串的区别在于要不要求连续上。子序列不要求连续,意味着子序列有2的n次方个,而子串只有n*(n-1)/2个,量级明显不同!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马