黑马程序员技术交流社区
标题:
获取最大相同字符串的问题。。[已解决]
[打印本页]
作者:
陈嘉宾
时间:
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:}
图解1.jpg
(60.5 KB, 下载次数: 27)
下载附件
2012-5-28 22:37 上传
图解2.jpg
(128.78 KB, 下载次数: 39)
下载附件
2012-5-28 22:37 上传
作者:
陈嘉宾
时间:
2012-5-28 22:50
谢谢楼上明白画图更直接啊!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2