黑马程序员技术交流社区
标题:
字符串练习中的一个问题
[打印本页]
作者:
李海
时间:
2012-6-16 15:56
标题:
字符串练习中的一个问题
class MaxSubstring // 在Java中 有一个习惯 就是顾头不顾尾
{
public String maxString(String s1, String s2)
{
for (int x=0; x<s2.length();x++ )
{
f
or (int y=0,z=s2.length()-x-1 ;z!=s2.length() ; y++,z++)
{
String temp=s2.substring(y,z); /
if (s1.contains(temp))
{
return temp;
}
}
}
return "";
}
}
class MaxSubstringTest
{
public static void main(String[] args)
{
MaxSubstring d= new MaxSubstring();
String str1="abcwertyuiodefhello";
String str2="cvbnmhello"; // 如果我这样写的话 输出的结果就是hell了 这是为什么?
System.out.println(d.maxString(str1,str2));
}
}
红色部分是我的问题和我以为出错误的地方 我不明白的是明明字符串是从0开始算起 这样str.length()来指示字符串不是已经越界了吗?
作者:
李盼
时间:
2012-6-16 16:07
本帖最后由 李盼 于 2012-6-16 16:19 编辑
你这种程序实现的就是str2和str1最大公共子集,也就是数学当中最大公约数的概念!
for (int x=0; x<s2.length();x++ )
{
for (int y=0,z=s2.length()-x-1 ;z!=s2.length() ; y++,z++) //当x=0的时,y=0,z=s2.length()-1也就是拿整个s2去和s1比较,看s1包不包含s2
{ //而z!=s2.length(),就是为了防止角标越界,因为z的初始值永远比s2.length小
//所以每次增加后都要判断,一但相等,就超过了s2的长度。其实这里改为z<s2.length()是一样的效果!
String temp=s2.substring(y,z); //内循环每循环一次,就是起始角标和结束角标同时向后移,
if (s1.contains(temp)) //外循环每循环一次,就是把起始角标和结束角标之间的距离缩小1
{
return temp;
}
}
}
作者:
黑马---邢志伟
时间:
2012-6-16 16:19
数组中有一个公共的实例变量是length.ta 他是指数组的长度的。。。。
作者:
黄连兵
时间:
2012-6-16 18:38
for (int y=0,z=s2.length()-x-1 ;z!=s2.length() ; y++,z++)
修改一下成:
for (int y=0,z=s2.length()-x-1 ;z<=s2.length() ; y++,z++)
运行就正常了。
api文档中的substring是这样写的:
public String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,
直到索引 endIndex - 1 处的字符
。因此,该子字符串的长度为 endIndex-beginIndex。
z=s2.length() 的时候,你才能获取到最后那个字符。
作者:
王明明
时间:
2012-6-16 20:55
本帖最后由 王明明 于 2012-6-16 21:16 编辑
其实是因为你的z!=s2.length() ;
假如你的相同字符是最后一个字符的话
就会因为z不能=s2.length();
所以他才会少取一个o
不是最后一个的话 就没问题了
所以就像上面说的
class MaxSubstring // 在Java中 有一个习惯 就是顾头不顾尾
{
public String maxString(String s1, String s2)
{
for (int x=0; x<s2.length();x++ )
{
for (int y=0,z=s2.length()-x-1 ;z<=s2.length() ; z++,y++)
{
String temp=s2.substring(y,z);
System.out.println(temp);
System.out.println(x);
System.out.println(y);
System.out.println(z);
if (s1.contains(temp))
{
System.out.println(x);
System.out.println(y);
System.out.println(z);
return temp;
}
}
}
return "";
}
}
class MaxSubstringTest
{
public static void main(String[] args)
{
MaxSubstring d= new MaxSubstring();
String str1="abdefhellqqqqoj";
String str2="cndhellqqqqo"; // 如果我这样写的话 输出的结果就是hell了 这是为什么?
System.out.println(d.maxString(str1,str2));
}
}
复制代码
这样就没问题 上面的同学给的方法
但是我觉得 他们分析错了
有不同意见的 欢迎回复讨论下...
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2