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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 54hxd52lj 于 2014-6-1 10:44 编辑

找出多个字符串中的最大公共子字符串。
  1. #include<stdio.h>     //头文件
  2. #include<string.h>    //头文件
  3. void main()     //主函数
  4. {
  5. char str[2][20];    //定义二维数组,共2个,每个20个字符  
  6. int i,j,t;      //定义整形变量
  7. for(i=1;i<=2;i++)      //进行2次循环
  8.     gets(str[i]);      //循环为2个一维数组赋值
  9. char *a=str[1];    //将数组str[1]的首地址给指针a
  10. char *b=str[2];    //将数组str[2]的首地址给指针b
  11. for(j=1;j<=20;j++)      //进行20次循环
  12.     {
  13.             if(strcmp(*(a+j),*(b+j))==0)   
  14.          //判断,对两个字符串的每一个字符进行比较,如果相等,执行
  15.         {
  16.                 t=*(a+j);   //将相等的字符赋值给temp
  17.                 printf("%c",t);     //打印输出数组temp                                
  18.         }
  19.     }
  20. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
傘が咲く + 2

查看全部评分

8 个回复

倒序浏览
你for循环的i  j为什么都要从1开始呢?
元素的索引是从0开始的  长度为2的话    就是str[0]  str[1]  没有str[2]
  1. for(int i=0;i<2,i++)
  2. {
  3. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报 1 0
⒈心只霸占沵 发表于 2014-5-31 20:40
你for循环的i  j为什么都要从1开始呢?
元素的索引是从0开始的  长度为2的话    就是str[0]  str[1]  没有s ...

哦,这样啊,那我改过来试试,谢谢啦!
回复 使用道具 举报
⒈心只霸占沵 发表于 2014-5-31 20:40
你for循环的i  j为什么都要从1开始呢?
元素的索引是从0开始的  长度为2的话    就是str[0]  str[1]  没有s ...

对,我也觉得这个地方有问题
回复 使用道具 举报
吉大人 发表于 2014-6-2 19:23
对,我也觉得这个地方有问题

谢谢啦!
回复 使用道具 举报
学习来了
回复 使用道具 举报
本帖最后由 董月峰 于 2014-6-2 21:55 编辑

大神代码看不懂,不明觉历!
感觉楼主大神的代码和求多个字符串的最大公共子串没有神马关系我给个求2个字符串之间最大公共子串的做法
  1. 主函数大约这么写的
  2. printf("请输入第一个字符串 :\n");
  3.         gets(ss1);
  4.         int len_s1=strlen(ss1);
  5.         printf("请输入第二个字符串 :\n");
  6.         gets (ss2);
  7.         int len_s2=strlen(ss2);
  8.         maxstr(ss1,ss2,len_s1,len_s2);
复制代码

调用的函数
  1. //比较2个字符串最大公共子串(串1,串2,串1长,串2长)
  2. void maxstr(char *s1,char *s2,int num1,int num2)
  3. {
  4.     //index表示字符相同时s1初始角标,n2表示公共子串初始长度是0,n1表示每个公共子串的长度
  5.         int index=0,n2=0,n1;
  6.     //遍历s1
  7.         for(int i = 0; i <= num1; i++)
  8.         {
  9.         //遍历s2
  10.                 for(int j = 0; j <= num2; j++)
  11.                 {
  12.             //若遇到相同字符
  13.                         if(s1==s2[j])
  14.                         {
  15.                 //先赋值子串长度是1
  16.                                 n1 = 1;
  17.                 //看从相同字符向后有多少字符还相同
  18.                                 for(int k = 1; s1[i+k]==s2[j+k]; k++)
  19.                 //每多一个相同字符,n1自增1
  20.                 {
  21.                     n1++;
  22.                 }
  23.                 //取n2为最长的n1
  24.                                 if(n1 > n2)
  25.                                 {
  26.                     //记录最长n2时候,s【i】的角标位置index
  27.                                         index = i;
  28.                                         n2 = n1;
  29.                                 }
  30.                 //再与s1比较,从s2【n1+j】即可
  31.                                 j += n1;
  32.                         }
  33.                 }
  34.         }
  35.     //当存在子串时候,输出最大的
  36.     if(n2 !=0)
  37.     {
  38.         printf("最长的公共子串:");
  39.         for(int i = 0; i < n2; i++)
  40.             printf("%c",s1[index+i]);
  41.     }
  42.     //不存在子串输出没有
  43.     else
  44.         printf("没有公共子串!\n");
  45. }
复制代码




回复 使用道具 举报
董月峰 发表于 2014-6-2 21:46
大神代码看不懂,不明觉历!
感觉楼主大神的代码和求多个字符串的最大公共子串没有神马关系
...

好吧,我正在努力中。
回复 使用道具 举报

与君共奋进:victory:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马