黑马程序员技术交流社区

标题: 本人原创代码:找出多个字符串中的最大公共子字符串 [打印本页]

作者: xiezhongmin    时间: 2015-3-9 19:30
标题: 本人原创代码:找出多个字符串中的最大公共子字符串
这是本人自己写,真正实现多个字符串比较,的花了4个多小时实在是汗颜,若可以优化或不足请指正,多谢讨论!下面代码
  1. #include <stdio.h>
  2. #include <string.h>

  3. int count = 0; // 保存用户输入了多少个字符串
  4. char ages[100][100]; // 保存用户输入的字符串数组
  5. char strMax[100]; // 保存公共字符串
  6. void maxZuichangZiFu(char str[],char str1[]) //判断最长公共字符串函数
  7. {
  8.     // 定义两个指针变量,p是保存最长公共字符串首地址,q是保存相同字符的首地址
  9.     char *p=NULL,*q=NULL;
  10.    
  11.     // 定义两个整型变量,n用于保存最大公共长度,n用于保存相同字符的长度
  12.     int m=0;
  13.     int n = 0;
  14.    
  15.     // 定义两个变量,保存str和str1的长度
  16.     long l1 = strlen(str);
  17.     long l2 = strlen(str1);
  18.    
  19.     for(int i = 0; i<l1; i++) // 循环str字符串的长度
  20.     {
  21.         
  22.         for(int j = 0; j<l2; j++) // 循环str1字符串的长度
  23.         {
  24.              m = 0; // i的每次比较m清0
  25.             // 同步比较str与str1字符串中相等的字符直到为\0时结束
  26.             for(int k = 0;str[k+i]!='\0'&& str1[k+j]!='\0'&& str[k+i]==str1[k+j]; k++)
  27.             {
  28.                
  29.                     m++; // 保存相同字符的数量
  30.                     q = &str[i]; // 保存首地址
  31.                
  32.             }
  33.             
  34.             if(m>n) // 判断最大相同字符的个数
  35.             {
  36.                 p = q; // 保存最大相同字符首地址
  37.                 n = m; // 保存最大相同字符的个数
  38.             }
  39.             
  40.         }
  41.         
  42.     }
  43.    
  44.     int s=0;
  45.     while(strMax[s++]!='\0')
  46.     {
  47.         strMax[s-1]='\0'; // 每次循环之前公共字符串清0
  48.     }
  49.    
  50.     // 判断是否有公共子字符串
  51.     if(n>0){
  52.         // 保存最大公共子字符串
  53.         for(s=0;s<n;s++){
  54.             strMax[s]=*(p+s);
  55.         }
  56.         
  57.         
  58.     }
  59.    
  60.    
  61. }



  62. void yongHuShuRu() //用户输入字符串函数
  63. {
  64.     char isYes[4]; // 保存用户输入的yes或其他字符
  65.    
  66.     // 接收用户输入的字符串
  67.     printf ("请输入字符串\n");
  68.     scanf("%s",ages[count]);
  69.     printf("你存入的字符串是:ages[%d]=%s\n",count ,ages[count]);
  70.     printf ("请输入字符串\n");
  71.     scanf("%s",ages[count+1]);
  72.     printf("你存入的字符串是:ages[%d]=%s\n",count+1 ,ages[count+1]);
  73.     do
  74.     {
  75.         // 提示用户是否继续输入
  76.         printf ("是否继续输入:yes继续,其它退出。\n");
  77.         scanf("%s",isYes);
  78.         
  79.         // 判断用户输入的是否为yes,若为yes继续输入,否则退出循环
  80.         if(strcmp(isYes,"yes"))
  81.         {
  82.             break;
  83.         }
  84.         else
  85.         {
  86.             printf ("请继续输入字符串\n");
  87.             scanf("%s",ages[count+2]);
  88.             printf("你存入的字符串是:ages[%d]=%s\n",count+2 ,ages[count+2]);
  89.         }
  90.         
  91.         count++; // 保存用户输入了多少个字符串
  92.         
  93.         
  94.     }while (1);
  95.    
  96. }


  97. int main(void)
  98. {
  99.     yongHuShuRu(); // 调用用户输入函数
  100.     maxZuichangZiFu(ages[0],ages[1]); // 首先比较用户输入的第一和第二个字符串,取得最长公共字符串
  101.    
  102.     // 拿这个最长公共字符串与其他所有字符串作比较,最后取得所有字符串中最长公共字符串
  103.     for (int i =2; i<count+2; i++)
  104.     {
  105.         
  106.         maxZuichangZiFu(ages[i],strMax);
  107.     }
  108.    
  109.     printf("所有字符串中最长公共字符串:%s\n",strMax); // 所有字符串中最长公共字符串
  110.    
  111.    
  112.     return 0;
  113. }
复制代码

作者: 喧闹的世界    时间: 2015-3-9 19:43
没什么难度,当然,如果要专门考虑时间,空间复杂度就需要做久一点,和我的思路一样,我基础测试也是碰到了这道题。感觉定义的时候长度最好用len,别只写个l,很容易和1混淆了
作者: xiezhongmin    时间: 2015-3-9 19:49
喧闹的世界 发表于 2015-3-9 19:43
没什么难度,当然,如果要专门考虑时间,空间复杂度就需要做久一点,和我的思路一样,我基础测试也是碰到了 ...

基础测试里应该就这题难点吧,那个啥学生管理系统就是代码多点还是算比较简单
作者: xiezhongmin    时间: 2015-3-9 19:57
喧闹的世界 发表于 2015-3-9 19:43
没什么难度,当然,如果要专门考虑时间,空间复杂度就需要做久一点,和我的思路一样,我基础测试也是碰到了 ...

看来你算法和数据结构学的不错,以后多交流呀




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