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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "stdlib.h"

  4. char str[100][100];
  5. int k;
  6. int match(int start,int end,int n)   //最短字符串中的起点下标、终点下标,字符串总数
  7. {
  8.         int i,j,len,p,h;
  9.         for(i=0;i<n;i++)
  10.         {
  11.                 if(i==k)
  12.                         continue;
  13.                 len=strlen(str[i]);
  14.                 for(j=0;j<=len-1-end+start;j++)    //str[i]字符串可以组成len-1-end+start个长度为end-start的连续子串
  15.                 {
  16.                         for(p=start,h=j;p<=end;p++,h++)    //顺序判断子串
  17.                         {
  18.                                 if(str[k][p]!=str[i][h])       //不等即跳出
  19.                                         break;
  20.                         }
  21.                         if(p>end)                   //如果全部相等,则匹配成功,终止
  22.                                 break;

  23.                         for(p=end,h=j;p>=start;p--,h++)             //逆序判断子串
  24.                         {
  25.                                 if(str[k][p]!=str[i][h])       //不等即跳出
  26.                                         break;
  27.                         }
  28.                         if(p<start)                   //如果全部相等,则匹配成功,终止
  29.                                 break;
  30.                 }
  31.                 if(j>len-1-end+start)    //如果搜索完毕都没终止,即无匹配
  32.                         return 0;
  33.         }
  34.         return 1;
  35. }
  36. int main(void)
  37. {
  38.         int t,i,j,n,len,minlen,flag;
  39.         scanf("%d",&t);
  40.         while(t--)
  41.         {
  42.                 minlen=1000,flag=0;
  43.                 scanf("%d",&n);
  44.                 for(i=0;i<n;i++)
  45.                 {
  46.                         scanf("%s",str[i]);
  47.                         len = strlen(str[i]);
  48.                         if(len<minlen)
  49.                         {
  50.                                 minlen=len;      //保存最短字符串的长度
  51.                                 k=i;             //保存最短字符串的序号
  52.                         }
  53.                 }
  54.                 for(i=0;i<minlen;i++)    //对最短字符串的连续字串进行匹配查找
  55.                 {
  56.                         for(j=0;j<=i;j++)
  57.                         {
  58.                                 if(match(j,j+minlen-1-i,n))    //子串是否匹配
  59.                                 {
  60.                                         flag=1;
  61.                                         break;
  62.                                 }
  63.                         }
  64.                         if(flag==1)
  65.                                 break;
  66.                 }
  67.                 printf("%d\n",minlen-i);
  68.         }
  69.         system("pause");
  70.         return 0;
  71. }
复制代码


从网上到找的 ,给大家分享一下。
里面的算法很基本 ,注释也很清楚。

如果当初多想一下的话,没准就拿到这2分了,很可惜。

16 个回复

倒序浏览
题目是什么呀?
回复 使用道具 举报

求最长公共字符串啊
回复 使用道具 举报
talent123 发表于 2015-6-3 17:33
求最长公共字符串啊

就这么一句?完全不懂题目要求是什么啊!
回复 使用道具 举报
学到了,谢谢
回复 使用道具 举报
张晓珊 发表于 2015-6-3 17:42
就这么一句?完全不懂题目要求是什么啊!

在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)

应该是这一个题,我先看看去
回复 使用道具 举报
很不错!思路很清晰
回复 使用道具 举报
taolove 来自手机 中级黑马 2015-6-6 01:25:45
8#
我也是!现在可以了!
回复 使用道具 举报
顶~~~~~~~~~
回复 使用道具 举报
好东西!!!!
回复 使用道具 举报
开始的时候真的是百思不得其解~~谢啦~
回复 使用道具 举报
围观学习了,刚开始时真是百思不得姐啊
回复 使用道具 举报
tabor 中级黑马 2015-6-10 11:12:35
13#
这是绝对要学习下的,谢谢!
回复 使用道具 举报
学习中啊,感谢
回复 使用道具 举报
不错不错不错哦
回复 使用道具 举报
学习学习!
回复 使用道具 举报
mark from iOS0612
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马