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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 kira 于 2014-1-25 10:32 编辑

这个也是我在复习的时候 发现的一个小问题
视频了说了一些 感觉还是听不懂
我上代码了 不懂的地方会做注释{:soso_e109:}
public class SubDemo {


        public static void main(String[] args) {
                // TODO Auto-generated method stub
        String s= mySub("asdadasd","sadasda");
        System.out.println(s);
        }
        public static String mySub(String s1,String s2){
                String max ="";
                String min = "";
                max = (s1.length()>s2.length())?s1:s2;
                min = (max==s1)?s2:s1;//这句也不理解 三元运算符我知道
                for(int x=0;x<min.length();x++){
                        for(int y=0,z=min.length()-x;z!=min.length()+1;y++,z++){//这句for循环非常不理解
                                
                                String temp =min.substring(y,z);
                                if(max.contains(temp)){
                                       
                                        return temp;
                                }
                        }
                        
                        
                }
               
                return"无法找到";
               
        }

}

希望大神详解

7 个回复

倒序浏览
{:soso__16952254467664163835_3:}

快学到了
回复 使用道具 举报
min = (max==s1)?s2:s1;//这句也不理解 三元运算符我知道
max这个字符串是S1吗,如果是那么返回s2给min,如果不是那么返回s1给min.就是min是除了max的那个.

for(int x=0;x<min.length();x++){
                        for(int y=0,z=min.length()-x;z!=min.length()+1;y++,z++){//这句for循环非常不理解
这句逻辑比较麻烦一点.
随着x递增,当x=0的时候,拿出来的时候整个min字符串跟max比,如果被包含了,就直接返回min,说明整个min都是重复的,那么最大也就这么多重复的了.
当x=1的时候,下面的循环是从0~min.length-1这个字符串是否被max包含,如果被包含就返回这个,说明这个是最大的了,因为上面已经判断不是全部被包含,如果前面length-1都被max包含,说明最后一个一定不被包含,返回前面length-1长度的min就可以了.如果没有包含,则z和y递增1,就是2~min.length再被判断.
如果min.length-1这么长没有被max包含,则开始进行min.length-2这么长开始判断,就这样一直到x=length-1最后一个循环的时候,z=1,y=0,一直到y=min.length-1而z=length,这样其实就是每个字符找一遍是不是被max包含,如果包含则返回这个字符.
其实整个的逻辑就是将这两个字符比较长短,将短的那个从最长慢慢减1长度去和2比,去找最长的被长的所包含的.

这个视频我没看过,不过这个逻辑很厉害,我之前也没见过.
回复 使用道具 举报
wushanwow 发表于 2014-1-24 01:16
min = (max==s1)?s2:s1;//这句也不理解 三元运算符我知道
max这个字符串是S1吗,如果是那么返回s2给min,如 ...

OK 大神 基本看懂了 y 和z好比是内循环两指针 z是右指针(min.length()-x)
只要右指针不等于假设最大相同字符串 min的时候 PS:min.length()+1 因为从0开始
就一直找 知道找到为止  
话说for循环这么写的 我果然见的比较少 估计见多了就好了 第一次用的时候感觉特复杂
回复 使用道具 举报
本帖最后由 jiangyutc 于 2014-1-24 20:20 编辑

min = (max==s1)?s2:s1;//这句也不理解 三元运算符我知道
        这句的意思是,max的值是不是等于S1的值,如果等于(true),那么就把S2的值赋给min

for(int y=0,z=min.length()-x;z!=min.length()+1;y++,z++){//这句for循环非常不理解
        这句的意思是
        变量y    等于 0
        变量Z    等于min字符串的长度减去外循环的次数
        这是两个变量是内循环变量的初始值
        当变量Z不等于min字符串的长度加1时,条件满足继续循环,每循环一次Y和Z的值都加1,直到内循环条件不满足为止。然后继续外循环,外循环条件满足就再进入内循环,直到外循环条件不满足就结束这个嵌套循环
回复 使用道具 举报
楼上几位解释的很好了,不凑热闹了,楼主加油!
回复 使用道具 举报
kira 中级黑马 2014-1-25 10:32:24
7#
jiangyutc 发表于 2014-1-24 20:17
min = (max==s1)?s2:s1;//这句也不理解 三元运算符我知道
        这句的意思是,max的值是不是等于S1的 ...

嗯嗯 了解了
回复 使用道具 举报
kira 中级黑马 2014-1-25 10:33:39
8#
俞帅明 发表于 2014-1-24 20:37
楼上几位解释的很好了,不凑热闹了,楼主加油!

:lol一起加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马