我正在研究一个问题,该问题要求返回两个给定字符串包含相同长度2子串的位置数。因此“xxcaazz”和“xxbaaz”产生3,因为“xx”,“aa”和“az”子串出现在两个字符串中的相同位置。据说解决方案如下:
public int stringMatch(String a, String b) {
// Figure which string is shorter.
int len = Math.min(a.length(), b.length());
int count = 0;
// Look at both substrings starting at i
for (int i=0; i<len-1; i++) {
String aSub = a.substring(i, i+2);
String bSub = b.substring(i, i+2);
if (aSub.equals(bSub)) { // Use .equals() with strings
count++;
}
}
return count;
}
我不明白为什么这个解决方案没有超出范围的例外。例如,如果有两个字符串分别输入长度为6和7,则在for循环的最后一次迭代中,i = 5。但是对于较小字符串的子字符串,给定的参数将是(5,7),即使字符串的最终索引是5.在以前的问题中,我似乎在类似的情况下产生了一个越界异常。为什么不在这里?所有人都非常感谢。
答案 0 :(得分:1)
如果我们假设您使用Java进行编码,则在方法substring(int beginIndex, int endIndex)
中,endIndex
是独占的。
来自http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#substring-int-int-:
参数:
beginIndex
- 起始索引,包括在内。
endIndex
- 结束索引,不包括。
因此,当您呼叫最后一次缩进时,i
等于4,因为i<len-1
条件中的for
;这样:
String bSub = b.substring(i, i+2);
=&GT; b.substring(4,6)=&gt; xxba az
如果您需要StringIndexOutOfBoundsException
,请删除-1
条件中的for
。
答案 1 :(得分:0)
正如你提到“在for循环的最后一次迭代中,i = 5 ”。在第5次迭代中,i = 4,您从第0个索引开始。所以输出是
0> xx == xx
1> xc == xb
2> ca == ba
3> aa == aa
4> az == az
对于substring函数,独占的第二个参数所以substring(4,6)永远不会尝试读取索引6.因此,程序不会导致 IndexOutOfBoundsException 。