黑马程序员技术交流社区

标题: 最开始最基础题申请的时候,并没做出来最长公共字符串。 [打印本页]

作者: talent123    时间: 2015-6-3 16:41
标题: 最开始最基础题申请的时候,并没做出来最长公共字符串。
  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分了,很可惜。
作者: 张晓珊    时间: 2015-6-3 17:10
题目是什么呀?
作者: talent123    时间: 2015-6-3 17:33
张晓珊 发表于 2015-6-3 17:10
题目是什么呀?

求最长公共字符串啊
作者: 张晓珊    时间: 2015-6-3 17:42
talent123 发表于 2015-6-3 17:33
求最长公共字符串啊

就这么一句?完全不懂题目要求是什么啊!
作者: Never_Yg    时间: 2015-6-3 17:48
学到了,谢谢
作者: Never_Yg    时间: 2015-6-3 17:51
张晓珊 发表于 2015-6-3 17:42
就这么一句?完全不懂题目要求是什么啊!

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

应该是这一个题,我先看看去
作者: 余丽丽    时间: 2015-6-6 00:28
很不错!思路很清晰
作者: taolove    时间: 2015-6-6 01:25
我也是!现在可以了!
作者: 蜡笔小炎    时间: 2015-6-6 01:52
顶~~~~~~~~~
作者: zhangyq    时间: 2015-6-6 02:16
好东西!!!!
作者: shmily3945    时间: 2015-6-6 02:52
开始的时候真的是百思不得其解~~谢啦~
作者: 小龙女的萝卜    时间: 2015-6-6 08:15
围观学习了,刚开始时真是百思不得姐啊
作者: tabor    时间: 2015-6-10 11:12
这是绝对要学习下的,谢谢!
作者: 天下1083    时间: 2015-6-10 11:35
学习中啊,感谢
作者: 这是829    时间: 2015-6-11 23:06
不错不错不错哦
作者: 王鹏    时间: 2015-6-13 22:13
mark from iOS0612




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2