黑马程序员技术交流社区

标题: 获取最大相同字符串的问题。。[已解决] [打印本页]

作者: 陈嘉宾    时间: 2012-5-28 21:51
标题: 获取最大相同字符串的问题。。[已解决]
本帖最后由 陈嘉宾 于 2012-5-28 22:51 编辑

这段代码越看越迷糊啊。。for(int x=0;x<s2.length();x++)
                {
                        for (int y=0,z=s2.length()-x;z!=s2.length()+1 ;y++,z++ )
                        {
                                String temp =s2.substring(y,z);


上代码求解答


class stringtest3
{
        public static String getMaxSubString(String s1,String s2)
        {
                for(int x=0;x<s2.length();x++)
                {
                        for (int y=0,z=s2.length()-x;z!=s2.length()+1 ;y++,z++ )
                        {
                                String temp =s2.substring(y,z);
                                if(s1.contains(temp))
                                        return temp;
                        }
                }
                return "";
        }
               

public static void main(String[] args)
        {
        String s1="avcwerthelloyuiodef"
        String s2="cvhellobnm"
        sop(getMaxSubString(s1,s2))
        }
        public static void sop()String str)
        {
                System.out.println(str);
        }
}
作者: 朝哥    时间: 2012-5-28 22:04
lz. 你可以换个思维考虑:
两个字符串
aabbaa
bbcd

先说说这个思路,最好理解:
思路:        1、        先取出短小字符串与长字符串相比                                                             也就是bbcd与aabbaa比
                        然后再在取出短小字符串的字串与长字符串相比,字串长度为长串长度-1          也是bbc与aabbaa比   或者    bcd与aabb比
                        然后再在取出短小字符串的字串与长字符串相比,字串长度为长串长度-2          也是bb与aabbaa比
                        以此类推,直到存在取出位置
                2、        看出以上规律:采用嵌套循环,外循环控制短串字串的长度(以上面为例:先取4,再取3,再取2)内循环取短串字串的个数(先取了1次,再去了2次,再取了3次)。
                3、        每取一次比一次。如果你能看出这个规律就做对了一半。

你这个代码不好理解,这是我自己的代码:


class String课堂练习4
{
        public static void main(String[] args)
        {
                String big = "abcde";
                String small = "cd";
               
                wc:for (int x=small.length(),z=1; ;x--,z++ )                                                //x=2 z=1                x=1 z=2               
                {
                        for (int y =0;y <z ;y++ )                                                                //执行一次                执行二次       
                        {
                                int temp = small.length()-z;                                                     //  temp=1                temp=2       
                                if (big.contains(small.substring(y,temp+y+1)))
                                {
                                        System.out.println(small.substring(y,temp+y+1));
                                        break wc;
                                }
                        }
                }
        }
}

做这样的题一定要有思路,这样才做的对与快。
作者: 朝哥    时间: 2012-5-28 22:06
强烈建议lz在本子上画出来,你用笔记本电脑是不好总结规律的。
作者: 陈嘉宾    时间: 2012-5-28 22:07
哦好我自己画个试试谢谢
作者: 小小企鹅    时间: 2012-5-28 22:13
本帖最后由 小小企鹅 于 2012-10-27 22:31 编辑

        public static String getMaxSubString(String s1,String s2)
        {
                for(int x=0;x<s2.length();x++)
                {//y为子串的开始位置,z为子串的的结束位置,
                 //先从最长子串开始,每一次遍历字串长度-1,
                        for (int y=0,z=s2.length()-x;z!=s2.length()+1 ;y++,z++ )
                        //对每一个字串长度进行遍历,y++,z++相当于子串位置后移
                        {
                                String temp =s2.substring(y,z);
                                if(s1.contains(temp))
                                        return temp;//如果s1包括temp的内容返回子串temp
                        }
                }
                return "";//遍历完没找到返回空字符串
        }

查找成功前,每次遍历时子串的值:
cvhellobnm

cvhellobn
vhellobnm

cvhellob
vhellobn
hellobnm

cvhello
vhellob
hellobn
ellobnm

cvhell
vhello
hellob
ellobn
llobnm

cvhel
vhell
hello
hello
第6次时找到hello为s1的子串,结束循环返回值

作者: 王月    时间: 2012-5-28 22:24
这个for嵌套是为了得到 s2 的每一个字符串,所以内循环定义了两个变量,相当于两个指针。
y=0,表示y从前往后截取,z=s2.length()-x表示从后往前,每循环一次,y+1,z-1。这样就能保证截取到锁s2的每个子字符串。
每循环一次,就判断一次这两个指针之间的字符串是否也包含在s1中,如果在某个时刻满足条件,则返回temp,这个字符串是第一次既被s2包含也被s1包含,所以肯定是s1和s2之间最大的相同子字符串。


作者: 朝哥    时间: 2012-5-28 22:27
我打错了,重新整理一下

先说说这个思路,最好理解:
思路:        1、        先取出短小字符串与长字符串相比                                                             也就是bbcd与aabbaa比
                        然后再在取出短小字符串的字串与长字符串相比,字串长度为短小串长度-1          也是bbc与aabbaa比   或者    bcd与aabbcc比
                        然后再在取出短小字符串的字串与长字符串相比,字串长度为短小串长度-2          也是bb与aabbaa比
                        以此类推,直到存在取出位置
                2、        看出以上规律:采用嵌套循环,外循环控制短串字串的长度(以上面为例:先取4,再取3,再取2)内循环取短串字串的个数(先取了1次,再去了2次,再取了3次)。
                3、        每取一次比一次。如果你能看出这个规律就做对了一半。

你有没有发现 ,最长的字符串一直都没变aabbcc,变的是bbcd,所以你只要会取bbcd的字串就行了。再整理一下
外循环第一次   bbcd                          内循环1次
外循环第二次   bbc或bcd                    内循环2次
外循环第三次   bb或者bc或者cd           内循环3次
以此类推
当然外循环第三次的时候就取出bb了。
作者: 袁梦希    时间: 2012-5-28 22:40
楼主你好,我认真的为你画了二张图,希望你能明白:{:soso_e100:}




作者: 陈嘉宾    时间: 2012-5-28 22:50
谢谢楼上明白画图更直接啊!




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