黑马程序员技术交流社区

标题: 获取最大子串的问题 [打印本页]

作者: 张雪磊    时间: 2012-7-18 21:16
标题: 获取最大子串的问题
  1. public static String getMaxSubString(String s1,String s2)
  2.         {

  3.                 String max = "",min = "";

  4.                 max = (s1.length()>s2.length())?s1: s2;

  5.                 min = (max==s1)?s2: s1;
  6.                
  7. //                sop("max="+max+"...min="+min);
  8.                 for(int x=0; x<min.length(); x++)
  9.                 {
  10.                         for(int y=0,z=min.length()-x; [color=Red]z!=min.length()+1[/color]; y++,z++)
  11.                         {
  12.                                 String temp = min.substring(y,z);
  13.                                
  14.                                 sop(temp);
  15.                                 if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
  16.                                         return temp;
  17.                         }
  18.                 }
  19.                 return "";
  20.         }
复制代码
请问在这个获取最大子串中的红色部分为什么是z!=min.length()+1,而不是z!=min.length()?length()本身不就是最大角标加1吗?.substring(y,z)包含头不包含尾所以取到长度不就是最大角标了吗?
作者: 于星星    时间: 2012-7-18 22:23
本帖最后由 于星星 于 2012-7-18 22:24 编辑

这里楼主可能弄错了一点东西, String substring(int beginIndex, int endIndex) 是包含头不包含尾的
用集合表示就是半开半闭区间(a,b]。所以要将z=min.length的情况包含进去,就要是z!=min.length()+1,也可以改成如下 :
public class Snippet {
        public static String getMaxSubString(String s1, String s2) {

                String max = "", min = "";
                max = (s1.length() > s2.length()) ? s1 : s2;
                min = (max == s1) ? s2 : s1;
                for (int x = 0; x < min.length(); x++) {
                        //因为z=min.length时是有效的截取,所以要包含在内
                        for (int y = 0, z = min.length() - x; z<min.length()+ 1; y++, z++) {
                                //这种方法产生很多子串,比较消耗内存                                
                                String temp = min.substring(y, z);
                                System.out.println((temp));
                                if (max.contains(temp))
                                        return temp;
                        }
                }
                return "";
        }

        public static void main(String[] args) {
                String str1 = "adsfjavafdsfe";
                String str2 = "dgjavaef";
                System.out.println(str2.substring(0,3));   //结果工dgj不包含下标为3的元素a
                System.out.println(str2.length());
                System.out.println(getMaxSubString(str1, str2));
        }

}


作者: 袁錦泰    时间: 2012-7-19 00:42
这和包含头不包含尾没什么关系,那是要限定区间范围,防止判断时尾指针角标越界的条件.




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