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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

毕老师的问题:
4. 获取两个字符串中最大相同子串,第一个动作:讲短的那个串进行长度依次递减的子串的打印
思路:
                1.将短的那个子串按照长度递减的方式获取到
                2.将每次获取到的子串去长串中判断是否包含
                        如果包含,已经找到!
                       
                疑问:
                String str = "abcdefghigklmnkhjtfdsaw";
                String str1 = "d bcdefghi c cdefghig";
                               
                上面两个字符串中最大相同子串其实有两个“bcdefghi”和“cdefghig”,
                我的程序要怎么修改才能正确找出这两个子串呢?

悲剧,人太笨了,想了好半天,结果大脑当机了,想去死。都是跟着老师的课程走,可素为毛我总和老师的思路相左啊,。✖_✖。✖_✖。✖_✖。也许我有点钻牛角尖了,不过大家帮我看看吧!我想实现的是找出字符串中所有的最大相同子串,自己想了半天就想出了一个方法来,大家还有什么比较好的方法么?给点建议,谢谢!
附上代码:
  1. class StringTest
  2. {
  3.         //主函数
  4.         public static void main(String[] args)
  5.         {
  6.                 //String str = "abghigfdkljtsawddcdefdddddddddddeddd";
  7.                 //String str1 = "d cdef c kljt d tsaw b fdkl";
  8.         String str = "abcdefghigklmnkhjtfdsaw";
  9.                 String str1 = "d bcdefghi c cdefghig";               
  10.                 getMaxString(str,str1);                       
  11.         }               
  12.         //打印功能
  13.         public static void sop(Object str)
  14.         {
  15.                 System.out.println(str);
  16.         }
  17.         public static void getMaxString(String str1,String str2)
  18.         {               
  19.                 思路:比较str1与str2长度,用短的那个字符串来一次递减长度,看长的那个是否包含短的那个字符串
  20.                 boolean contains()               
  21.                 for循环中,三个变量,numOfChar,beginIndex,endIndex  的含义               
  22.                 x代表字符串2减少的字符数
  23.                 beginIndex  代表减少字符后获取子串的起始坐标
  24.                 endIndex  代表减少字符后获取子串的结束坐标                                       
  25.                 String min ="";
  26.                 String max = "";
  27.                 int flag = 0;//用于获取首次遇到相同子串的时候,减少的字符数。之后把它用于循环中检查减少该字符数后是否还有其他相同子串。
  28.                 if(str1.length()>str2.length())
  29.                 {
  30.                         min = str2;
  31.                         max = str1;
  32.                 }               
  33.                 out:for(int numOfChar = 0;numOfChar<min.length();numOfChar++)
  34.                 {
  35.                         flag = numOfChar;
  36.                         //sop(flag);
  37.                         for(int beginIndex = 0,endIndex=min.length()-numOfChar;endIndex<min.length()+1;)
  38.                         {                               
  39.                                         //if(max.contains(min.substring(beginIndex,endIndex)))                                       
  40.                                         //sop(min.substring(beginIndex,endIndex));
  41.                                         if(max.contains(min.substring(beginIndex,endIndex)))
  42.                                         {
  43.                                                 min.substring(beginIndex,endIndex);
  44.                                                 break out;
  45.                                         }
  46.                                         beginIndex++;
  47.                                         endIndex++;
  48.                         }                                               
  49.                 }       
  50.                 for(int beginIndex = 0,endIndex=min.length()-flag;endIndex<min.length()+1;)
  51.                 {
  52.                         if(max.contains(min.substring(beginIndex,endIndex)))
  53.                         {
  54.                                 sop(min.substring(beginIndex,endIndex));
  55.                         }
  56.                         beginIndex++;
  57.                         endIndex++;
  58.                 }               
  59.         }       
  60. }
复制代码

评分

参与人数 1黑马币 +1 收起 理由
高彰谦 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
刘基军 发表于 2012-4-25 11:26
我也来发一个,O(∩_∩)O

果然集合方便多了。之前我就觉得要怎么知道我已经找到最长的相等字符串而烦恼。。。。。{:2_30:}悲剧学以致用啊。。。
回复 使用道具 举报
高彰谦 发表于 2012-4-25 04:17
转了半天总算是出来了,代码比楼主的简洁,大家有什么建议或意见可以站内信通知我 ...

- -.果然简介多了。只不过当时的想法就是想在使用String类的基础上能简化就好了
不过,貌似我又钻牛角尖了。既然用其他的方法能简化,其实也是一样的效果。﹁_﹁✿
回复 使用道具 举报
我也来发一个,O(∩_∩)O
  1. class TestDemo {
  2.         public static void main(String argv[]) {
  3.                 String str = "abcdefghigklmnkhjtfdsaw";
  4.         String subStr = "d bcdefghi c cdefghig";
  5.         System.out.println(getCommonStr(str, subStr));
  6.         }
  7.        
  8.         public static List getCommonStr(String str, String subStr) {
  9.                 List<String> list = new ArrayList<String>();
  10.                 for(int i=0; i< subStr.length(); i++) {
  11.                         for(int j=0,m=subStr.length()-i; m!=subStr.length()+1; j++,m++) {
  12.                                 if(str.contains(subStr.substring(j, m)))
  13.                                         list.add(subStr.substring(j, m));
  14.                         }
  15.                         if(list.size() != 0)
  16.                                 return list;
  17.                 }
  18.                 return null;
  19.         }
  20.        
  21. }
复制代码
回复 使用道具 举报
  1. public ArrayList<String> getLonggestPubSubStr(String shortter,String longger){
  2.                 ArrayList<String> tempList=new ArrayList<String>();
  3.                 int length=shortter.length();
  4.                 for(int len=length;len>0;len--){
  5.                         for(int i=0;i<length-len+1;i++){
  6.                                 String tempStr=shortter.substring(i, len+i);
  7.                                 if(longger.indexOf(tempStr)!=-1){
  8.                                         tempList.add(tempStr);
  9.                                 }
  10.                         }
  11.                         if(tempList.size()!=0)
  12.                                 return tempList;
  13.                 }
  14.                 return null;
  15.         }
复制代码
  1. String str = "abcdefghigklmnkhjtfdsaw";
  2.         String str1 = "d bcdefghi c cdefghig";
  3.                 System.out.println(getLonggestPubSubStr(str, str1));
复制代码
转了半天总算是出来了,代码比楼主的简洁,大家有什么建议或意见可以站内信通知我
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马