黑马程序员技术交流社区

标题: 找出多个字符串中的最大公共子字符串,如“nbitheimanb”和... [打印本页]

作者: huh    时间: 2015-12-27 20:08
标题: 找出多个字符串中的最大公共子字符串,如“nbitheimanb”和...
  1. /*
  2. main.m
  3. 找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
  4. 分析:
  5.     公共子字符串:连续相同的字符串
  6.     最大的公共子字符串:连续相同的字符串中长度最长得!

  7.     1)拿某个字符串跟另一个字符串进行比较,先找到相同的字符,如果相同,在比较后面一个字符,如果相同,那它就是相同的字符串了!
  8.     2)如何取得最大的字符串?
  9.         确认它是相同字符串时,记录字符串中字符的个数!(从1开始),下次相同字符循环时,相同字符个数>原有个数,那现有个数为最大字符串!
  10.     3)记录最大字符串的下标,最大字符下标 + 字符个数 = 最大字符串!
  11.     这个可以用OC来写,下次试试!
  12. */
  13. //#import <Foundation/Foundation.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. int main(){
  17.     char * s1 = "nbitheimanb";
  18.     char * s2 = "itheia";
  19.    
  20.     void maxString(char* s1, char* s2);
  21.     maxString(s1, s2);
  22.    
  23.     return 0 ;
  24. }

  25. //求出相同字符串中个数最多的字符
  26. void maxString(char* s1, char* s2){
  27.    
  28.     //求出s1,s2的长度
  29.     int s1len = strlen(s1);
  30.     int s2len = strlen(s2);
  31.    
  32.     int count = 0;//相同字符串中字符的个数
  33.     int index = 0;//相同字符串中最大的字符的首下标
  34.    
  35.     //将字符串中的每个字符与另一个字符串中每个字符进行比较
  36.     for (int i = 0 ; i<=s1len; i++) {
  37.         for (int j = 0; j<=s2len;j++) {
  38.             if(s1[i] == s2[j]){//对比两个字符是否相同
  39.                 //再次判断两个字符后面的字符是否相同,如相同则为字符串
  40.                 for (int k = 1; s1[i+k]==s2[j+k] && s1[i+k]!='\0' && s2[j+k]!='\0'; k++) {
  41.                     //判断相同字符的个数,如果大于上次的个数,则将现有的个数替换原有得
  42.                     //就是求出了,个数最多的相同字符串
  43.                     if (k>count) {
  44.                         count = k;//更改原有相同字符的个数
  45.                         index = i;//相同字符个数最多的首字符的下标
  46.                     }
  47.                 }
  48.             }
  49.         }
  50.     }
  51.    
  52.     if (count == 0) {
  53.         printf("没有相同的字符");
  54.     }else{
  55.         void printString(char *s1,int index,int count);
  56.         printString(s1, index, count);
  57.     }
  58.    
  59. }

  60. //截取字符串中的字符,并打印
  61. void printString(char *s1,int index,int count){
  62.     //打印出相同个数最多的字符串
  63.     for (int i = 0; i<=count; i++) {
  64.         printf("%c",s1[index+i]);
  65.     }
  66.     printf("\n");
  67. }
复制代码







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