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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任子杰 中级黑马   /  2015-11-7 17:50  /  592 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
  2. */
  3. #include <stdio.h>
  4. #include <string.h>

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



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


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


1 个回复

正序浏览
非常不错,必须顶起
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马