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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张雪磊 中级黑马   /  2012-7-18 21:16  /  1571 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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)包含头不包含尾所以取到长度不就是最大角标了吗?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
本帖最后由 于星星 于 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));
        }

}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这和包含头不包含尾没什么关系,那是要限定区间范围,防止判断时尾指针角标越界的条件.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马