黑马程序员技术交流社区

标题: 请教一个问题 --两个字符串中最大相同的子串 [打印本页]

作者: 陈波    时间: 2012-4-26 17:25
标题: 请教一个问题 --两个字符串中最大相同的子串
public static void main(String[] args) {
  String s1 = "qwerabcdtyuiop";
  String s2 = "xcabcdvbn";
  String s = getMaxSubstring(s2, s1);
  System.out.println("s=" + s);
}      
public static String getMaxSubstring(String s1, String s2) {
               
                String max = null,min = null;
                max = (s1.length()>s2.length())?s1:s2;
               
                min = max.equals(s1)?s2:s1;
               
                System.out.println("max="+max);
                System.out.println("min="+min);
               
               
               
                for (int i = 0; i < min.length(); i++) {
                        
                        for(int a = 0,b = min.length()-i; b != min.length()+1; a++,b++){
                                
                                String sub = min.substring(a, b);
                                if(max.contains(sub))
                                        return sub;
                        }
                }
               
                return null;
        }
}

for循环语句中 b != min.length()+1 这个地方为什么要加1 ??

作者: 林德燚    时间: 2012-4-26 17:49
     for (int i = 0; i < min.length(); i++) {
                        
                        for(int a = 0,b = min.length()-i; b != min.length()+1; a++,b++){
                                                                    //这里的b为子串的长度,子串的长度不能大于角标,但这里是用substring(a,b),
                                              //是到b点,但不包括b,所以要截取到最后一个字符就必须比字符串长度大1;这样说明白吗?
                                              //这里可以把b!=min.length()+1改成b<=min.length();

                                
                                String sub = min.substring(a, b);
                                if(max.contains(sub))
                                        return sub;
                        }
               

作者: 高彰谦    时间: 2012-4-26 18:01
这是由于subString(startIndex,endIndex);
它得到的子串是startIndex下标开始,到endIndex-1结束。
所以如果length不加1的话,永远取不到最后一的字符
作者: 王敏NO.09    时间: 2012-4-26 18:09
substring(a, b),意思是从a取到b,但b不能a相等,要大于a才能取
作者: 贾联国    时间: 2012-4-26 18:12
public String substring(int beginIndex,int endIndex)返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。 所以要+1否则最后的字符取不到
作者: suiabing    时间: 2012-4-26 18:55

/


该说的楼上的基本都说了,我直接发我画的一个图吧,这个图我在原来帖子里也发过!可以找一下原思路。

substring(a,b) 包含头不包含尾
我补充一下其他的吧

如果两个字符串其中一个为空,那么直接返回空。如果不做这个判断的话下面contains()会抛出异常要try一下
contains
public boolean contains(CharSequence s)当且仅当此字符串包含指定的 char 值序列时,返回 true。

参数:
s – 要搜索的序列
返回:
如果此字符串包含 s,则返回 true,否则返回 false
抛出:
NullPointerException – 如果 s 为 null
从以下版本开始:
1.5


public static String getMaxSubstring(String s1, String s2)//在你的函数体前面加上

{
         if (str1==null || str2== null) //如果有一个字符串为空 返回空,结束函数
          return null;
}


哦了

作者: 陌路行者    时间: 2013-6-20 18:37
我也学习一下




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