黑马程序员技术交流社区

标题: 一段新手看起来很吃力的代码,求解释 [打印本页]

作者: 灵感    时间: 2012-8-4 17:04
标题: 一段新手看起来很吃力的代码,求解释
  1. <blockquote>/*
复制代码
代码运行没有问题,for循环那的内循环不是很懂,毕老师将的稍微快了点,求指点

作者: 灵感    时间: 2012-8-4 17:05
  1. /*
  2. 需求:获取两个字符串中最大相同子串
  3. */

  4. class StringTest3
  5. {
  6.         static String getMaxSubString(String s1 ,String s2)//传入两个字符串s1  s2
  7.         {
  8.                 for(int x=0;x<s2.length();x++)
  9.                 {
  10.                         for(int y=0,z=s2.length()-x; z!=s2.length()+1; y++,z++)
  11.                         {
  12.                                 String temp = s2.substring(y,z);
  13.                                 //sop(temp);
  14.                                 if(s1.contains(temp))
  15.                                         return temp;
  16.                         }
  17.                 }
  18.                 return "";
  19.         }

  20.         public static void sop(String str)
  21.         {
  22.                         System.out.println(str);
  23.         }

  24.         public static void main(String[] args)
  25.         {
  26.                 String s1 = "saased helloaasdf";
  27.                 String s2 = "asdhellosd";
  28.                 sop(getMaxSubString(s1,s2));
  29.         }
  30. }
复制代码
代码没粘的上去,代码在这里

作者: 灵感    时间: 2012-8-4 17:06
{:soso__7116158046136899198_2:}
作者: 灵感    时间: 2012-8-4 17:06
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:06
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:07
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:07
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:08
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:08
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:08
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:08
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:09
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:09
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:09
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:09
{:soso__6235880048239246314_3:}
作者: 灵感    时间: 2012-8-4 17:10
{:soso__6235880048239246314_3:}
作者: 赵俊杰    时间: 2012-8-4 17:11
楼主,刷屏不好吧,{:soso_e107:}
作者: 灵感    时间: 2012-8-4 17:13
赵俊杰 发表于 2012-8-4 17:11
楼主,刷屏不好吧,

没,我不是故意的,郁闷当中
作者: 谭培龙    时间: 2012-8-4 17:54
  1. /*
  2. 需求:获取两个字符串中最大相同子串
  3. */

  4. class StringTest3
  5. {
  6.         static String getMaxSubString(String s1 ,String s2)//传入两个字符串s1  s2
  7.         {
  8.                 for(int x=0;x<s2.length();x++)//外循环,控制长度,内循环每运行一次,temp的长度-1。
  9.                 {
  10.                         for(int y=0,z=s2.length()-x; z!=s2.length()+1; y++,z++)//这段代码默认s2是短串,s1是长串,y是头z是尾。
  11.                         {
  12.                                 String temp = s2.substring(y,z);
  13.                                 //sop(temp);
  14.                                 if(s1.contains(temp))//如果接收到相同元素则返回true就return
  15.                                         return temp;
  16.                         }
  17.                 }
  18.                 return "";
  19.         }

  20.         public static void sop(String str)
  21.         {
  22.                         System.out.println(str);
  23.         }

  24.         public static void main(String[] args)
  25.         {
  26.                 String s1 = "saased helloaasdf";
  27.                 String s2 = "asdhellosd";
  28.                 sop(getMaxSubString(s1,s2));
  29.         }
  30. }
复制代码
下面这图是我的思路图画的比较烂。 这题是要小串自减去和大串比较看是否属于大串

123.JPG (25.28 KB, 下载次数: 50)

123.JPG

作者: 刘润辰    时间: 2012-8-4 18:04
先回复着

作者: 宫明星    时间: 2012-8-4 18:17
学习一下
作者: 刘悦    时间: 2012-8-4 20:03
路过看一下,顺便学习一下
作者: 刘悦    时间: 2012-8-4 20:14
谭培龙 发表于 2012-8-4 17:54
下面这图是我的思路图画的比较烂。 这题是要小串自减去和大串比较看是否属于大串
...

给力!!!本来没看下面在自己写,后来翻到中间看到哥们如此给力的解答,我直接CTRL+A+delete 把写的删掉了,图文并茂,太给力了!领教!:handshake
作者: 灵感    时间: 2012-8-6 08:34
谭培龙 发表于 2012-8-4 17:54
下面这图是我的思路图画的比较烂。 这题是要小串自减去和大串比较看是否属于大串
...

不是两端同时自减的,你也理解错了,而且长字符串它是不自减的吧
作者: 郑枫    时间: 2012-8-6 09:19
19楼讲解已经很详细了,我是看了四五遍才明白过来。

作者: 胡文凡    时间: 2012-8-6 09:29
本帖最后由 胡文凡 于 2012-8-6 09:40 编辑

这段代码理解起来先是要理清它的思路:
默认s2为短串没错。然后是要看s1与s2的最大子串,就将s2按各种方法截取子字符串,要遍历完各种截取方法,然后看s1中是否包含了这段子串,有的话并且长度最长就是要求的最大子串了。
这个方法好处在遍历s2的截取方法中,每层循环按照截取的长度自减。遍历的完并且每层外循环截取的长度都自减1。如果有符合要求的子串就直接返回,因为那就是要的最大子串了。具体分析:
第一层外循环截取s2:     0~s2.length                 长度:s2.length(从0开始计)
第二层外循环截取s2:     0~s2.length-1
                                      1~s2.length                 长度:s2.length-1

第三层外循环截取s2:     0~s2.lenth-2
                                      1~s2.lenth-1
                                      2~s2.lenth                   长度:s2.lenth-2
依次类推。。。
如果有两个最大子字符串,则返回从左至右最先截取到的。
应该就是这样吧。。。。
补充一下,不是默认s2为短串。应为如果截取的长度过大比s1大的话。还是不能满足判断条件s1.contains(temp),得不到返回,所以不用默认s2是短串


作者: 赵俊杰    时间: 2012-8-6 09:53
{:soso_e179:}
作者: 杨志    时间: 2012-8-6 11:42
楼主不要刷楼!否则后果自负!
作者: 灵感    时间: 2012-8-6 14:31
杨志 发表于 2012-8-6 11:42
楼主不要刷楼!否则后果自负!

不好意思,真不是故意的,以后不会了




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