黑马程序员技术交流社区

标题: 找出多个字符串中的最大公共子字符串,求代码重构 [打印本页]

作者: gululu23    时间: 2014-12-21 11:54
标题: 找出多个字符串中的最大公共子字符串,求代码重构
  1. //找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)

  2. #include <stdio.h>
  3. #include <string.h>
  4. int  main()
  5. {
  6.         
  7.     char *s1 = "nbitheimanbcf";
  8.     char *s2 = "itheia";
  9.    
  10.     void maxPublicString(char *s1,char *s2);
  11.     maxPublicString(s2,s1);
  12.    
  13.     return 0;
  14. }
  15. void maxPublicString(char *s1,char *s2)
  16. {
  17.     //分别求出s1,s2字符串的长度
  18.     int s1len = strlen(s1);
  19.     int s2len = strlen(s2);
  20.    
  21.     //记录相同元素下标,记录相同的元素个数
  22.     int index = 0 ,count = 0;
  23.    
  24.     //遍历s1
  25.     for(int i = 0; i<s1len ; i++)
  26.     {
  27.         
  28.         //遍历s2
  29.         for(int j = 0; j<s2len; j++)
  30.         {
  31.             
  32.          //取出s2的每一个元素s1进行比较,
  33.             if(s1[i]==s2[j])
  34.             {
  35.                 //如果有相同的元素,则同时都往后面移动
  36.                 for(int k = 1 ;s1[i+k]==s2[j+k] && s2[j+k]!='\0' && s1[i+k]!='\0' ;k++)
  37.                 {
  38.                     //选出最大公共字符串
  39.                     if(k>count)
  40.                     {
  41.                         //记录最大公共字符串长度的下标
  42.                         count =k;
  43.                         
  44.                         //记录最大公共字符串长度的个数
  45.                         index = i;
  46.                         
  47.                     }
  48.                 }
  49.                
  50.                
  51.             }

  52.         }
  53.         
  54.         
  55.     }
  56.     if(count == 0)
  57.     {
  58.         printf("没有找到最大公共子串\n");
  59.     }
  60.     else
  61.     {
  62.         printf("最长公共字串是:");
  63.       
  64.         for(int i = 0 ; i<=count; i++)
  65.         {
  66.             printf("%c",s1[index+i]);
  67.         }
  68.     }
  69.     printf("\n");
  70.       
  71. }
复制代码

作者: 李欢宇    时间: 2014-12-21 14:52
我基础测试里就有这个题,挺不好想的。
作者: chasedream    时间: 2015-1-2 22:48
写的非常好,赞一个!
作者: 刘运新    时间: 2015-6-9 10:24
我这个基础测试最后一题是这个
作者: gundana121    时间: 2015-7-28 14:27
学习了,顶一下
作者: a124113798    时间: 2015-9-21 21:47
这是泄题么。。。。
作者: 唐肖虎    时间: 2015-9-30 21:27
赞一下,这个写的非常棒,思路非常清晰,感谢!
作者: leoric    时间: 2015-11-22 23:31
思路清晰,赞,赞,赞!!!
作者: cxk    时间: 2015-11-29 21:55
写的非常好 ,思路很清晰,感觉好长呢
作者: song0619    时间: 2015-12-22 15:10
我基础测试题里也没有,不过这个思路很好。
作者: 我是薛明星    时间: 2016-1-1 23:10
高手啊  佩服
作者: fanzq    时间: 2016-1-3 14:53
3个字符串求最大子字符串,这个应该做不到吧
作者: tyoung    时间: 2016-2-5 13:58
66666666666666
作者: liusonglin    时间: 2016-8-2 20:37
之前看到过这个题目,正在想怎么做呢,语言的思想相通。
作者: liusonglin    时间: 2016-8-3 12:31
本帖最后由 liusonglin 于 2016-8-3 12:39 编辑

[Java] 纯文本查看 复制代码
/*
* 注:此程序在公共子字符串长度为1的情况下,会出现下例中的现象。
*
* 例:"abbbbbbc"和"addddc" 的结果为a(严格来说a和c都应该算作公共子字符串).
*/
import java.util.Scanner;

public class Test {
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入字符串的个数:");
                int num = Integer.parseInt(sc.nextLine());

                // 该数组用于存储键盘录入的字符串
                String[] arr = new String[num];
                // 该数组用于备份字符串
                String[] arr2 = new String[num];

                // 存储字符串
                for (int x = 0; x < num; x++) {
                        System.out.println("请输入第" + (x + 1) + "个字符串:");
                        String s = sc.nextLine();
                        arr[x] = s;
                        arr2[x] = s;
                }

                // 获取所有字符串的公共子字符串
                String commonString = getAllCommonString(arr);
                System.out.println("您输入的字符串为:");

                // 遍历数组
                for (String s : arr2) {
                        System.out.println(s);
                }

                // 考虑到可能没有公共子字符串
                if (commonString.isEmpty()) {
                        System.out.println("没有公共的子字符串.");
                } else {
                        System.out.println("这些字符串的最大公共子字符串为:" + commonString);
                }
        }

        // 这是获取多个字符串中的最大公共子字符串的方法
        public static String getAllCommonString(String[] arr) {
                for (int x = 0; x < arr.length - 1; x++) {
                        arr[x + 1] = getCommonString(arr[x], arr[x + 1]);
                }

                return arr[arr.length - 1];
        }

        // 这是获取两个字符串的最大公共子字符串的方法
        public static String getCommonString(String str1, String str2) {
                String max = str1.length() > str2.length() ? str1 : str2;
                String min = max == str1 ? str2 : str1;

                for (int x = 0; x < min.length(); x++) {
                        for (int start = 0, end = min.length() - x; end <= min.length(); start++, end++) {
                                String sub = min.substring(start, end);
                                if (max.contains(sub)) {
                                        return sub;
                                }
                        }
                }

                // 这里不返回null的原因是为了避免空指针异常
                // 如果确实没有公共子字符串则返回的内容为空
                String s = "";
                return s;
        }
}



作者: Stone_熊小叔    时间: 2016-10-11 16:53
{:2_31:}思路很棒!




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