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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. //
  2. //  main.m
  3. //  测试题10
  4. //
  5. //  Created by 林柯 on 15/4/16.
  6. //  Copyright (c) 2015年 itcast. All rights reserved.
  7. //

  8. /*
  9. 10、 找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)


  10. 设计思路:
  11. 先判断哪个字符串的字符长度较短,假设为str1,在该字符串上建立循环,从第一个字符(i=0)开始
  12. 该字符在另一个字符串(假设为str2)中第一次出现的位置,若没有找到,则跳到str1的第二个字符(i=1)开始
  13. 若找到,则定位str2中该字符的位置(str2+j),开始依次判断接下来的字符是否相等,若相等将length的值+1
  14. 直到不相等为止,将最终的length与maxLength相比,若length>maxLength,maxLength=length;并储存字符字串
  15. 接着继续从str2+j开始继续查找是否有与str+i相同的字符……直到字符串末尾
  16. 接着将i的值+1,继续上述步骤;最后输出储存的字符串

  17. 获取三个字符串的最大公共字串
  18. 设计思路:
  19. 和设计获取两个字符串的最大公共字串的流程大致一样
  20. 从最短的字符串开始开始进行循环,但在第二个字符串中找到相同字符时不直接进行length的计算,
  21. 而是开始在第三个字符串中进行检索,找到相同字符再进行length的计算

  22. 以此类推可以写出N个字符串中的最大公共字串

  23. */
  24. #include <stdio.h>
  25. #include <string.h>

  26. /**
  27. *  查找两个字符串中的最大字串
  28. *
  29. *  @param sameStr 用来储存最大字串的字符数组的指针地址
  30. *  @param str1    用来比较的字符串1
  31. *  @param str2    用来比较的字符串2
  32. */
  33. void findSameInTwoStr(char *sameStr,char *str1,char *str2);

  34. /**
  35. *  查找三个字符串中的最大字串
  36. *
  37. *  @param sameStr 用来储存最大字串的字符数组的指针地址
  38. *  @param str1    用来比较的字符串1
  39. *  @param str2    用来比较的字符串2
  40. *  @param str3    用来比较的字符串3
  41. */
  42. void findSameInThreeStr(char *sameStr,char *str1,char *str2,char *str3);





  43. int main(void)
  44. {
  45.     //定义用来测试的字符串
  46.     char *str1 = "nbitheimanb";
  47.     char *str2 = "itheianb";
  48.     char *str3 = "foianb";
  49.    
  50.     //定义一个字符数组,存储两个字符串中的最大字串
  51.     char sameStr[80];
  52.     findSameInTwoStr(sameStr,str1, str2);
  53.    
  54.     //定义一个字符数组,存储三个字符串中的最大字串
  55.     char sameStr2[80];
  56.     findSameInThreeStr(sameStr2, str1, str2, str3);
  57.    
  58.     //打印测试结果
  59.     printf("%s\n%s\n",sameStr,sameStr2);
  60.     return 0;
  61. }



  62. void findSameInThreeStr(char *sameStr,char *str1,char *str2,char *str3)
  63. {
  64.     /*利用字符指针数组将str1,str2,str3的指针
  65.       以其所指向字符串长度从小到大重新分配给str1,str2,str3*/
  66.     char *str[3] = {str1,str2,str3};
  67.     for (int i = 0; i < 2; i++) {
  68.         for (int j = i+1; j < 3; j++) {
  69.             if (strlen(str[i]) > strlen(str[j])) {
  70.                 char *temp = str[i];
  71.                 str[i] = str[j];
  72.                 str[j] = temp;
  73.             }
  74.         }
  75.     }
  76.     str1 = str[0];
  77.     str2 = str[1];
  78.     str3 = str[2];
  79.     //定义int型变量,用来储存字串长度,最长字串长度
  80.     int length = 0,maxLength = 0;
  81.     //从str1中第一个字符开始,寻找str2中该字符的位置
  82.     for (int i = 0;i < strlen(str1);i++) {
  83.         for (int j = 0; j < strlen(str2); j++) {
  84.             //如果找到相同的字符,则在str3中寻找该字符
  85.             if (*(str1+i) == *(str2+j)){
  86.                 for (int k = 0; k < strlen(str3); k++) {
  87.                     //如果在三个字符串中都找到该字符,则开始计算相同字串长度
  88.                     if (*(str1+i) == *(str2+j) && *(str1+i) == *(str3+k)) {
  89.                         length = 0;
  90.                         while (*(str1+i+length) == *(str2+j+length) && *(str1+i+length) == *(str3+k+length)) {
  91.                             length++;
  92.                         }
  93.                     }
  94.                     //若字串长度大于历史最长长度,则覆盖历史最长长度,并储存字符字串
  95.                     if (length>maxLength) {
  96.                         maxLength = length;
  97.                         for (int count = 0; count < length; count++) {
  98.                             *(sameStr+count) = *(str1+i+count);
  99.                         }
  100.                     }
  101.                 }
  102.             }
  103.         }
  104.     }
  105.         
  106. }



  107. void findSameInTwoStr(char *sameStr,char *str1,char *str2)
  108. {
  109.     //获取str1指针指向最短的字符串,str2指向较长的字符串
  110.     if (strlen(str1) > strlen(str2)) {
  111.         char *temp = str1;
  112.         str1 = str2;
  113.         str2 = temp;
  114.     }
  115.     //定义int型变量,用来储存字串长度,最长字串长度
  116.     int length = 0,maxLength = 0;
  117.     /*取出str1+i对应的字符,在str2中寻找,若找到,其地址为str2+j
  118.       此时将使用一个while循环求出该字串的长度,之后将该长度与历史最长长度对比
  119.       若该长度较长,覆盖历史最长长度,保存该字符串,再进行下一次检索
  120.       直到str1的字符都取完为止*/
  121.     for (int i = 0; i < strlen(str1); i++) {
  122.         for (int j = 0; j < strlen(str2); j++) {
  123.             if (*(str1+i) == *(str2+j)) {
  124.                 length = 0;
  125.                 while (*(str1+i+length) == *(str2+j+length)) {
  126.                     length++;
  127.                 }
  128.             }
  129.             if (length>maxLength) {
  130.                 maxLength = length;
  131.                 for (int count = 0; count < length; count++) {
  132.                     *(sameStr+count) = *(str1+i+count);
  133.                 }
  134.             }
  135.         }
  136.     }
  137. }
复制代码

1 个回复

倒序浏览
代码有点略长,希望有兴趣的朋友可以耐心看看
给我一些建议,大家共同进步
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马