给定2个字符串a和b,返回它们包含相同长度2子串的位置数。例如,a和b分别是“xxcaazz”和“xxbaaz”产生3,因为“xx”,“aa”和“az”子串出现在两个字符串中的相同位置。 我的解决方案出了什么问题?
int count=0;
for(int i=0;i<a.length();i++)
{
for(int u=i; u<b.length(); u++)
{
String aSub=a.substring(i,i+1);
String bSub=b.substring(u,u+1);
if(aSub.equals(bSub))
count++;
}
}
return count;
}
答案 0 :(得分:1)
为了解决您的解决方案,您真的不需要内循环。由于两个字符串中的子字符串的索引应该相同,因此只需要一个循环。
此外,您应该迭代到较小字符串的第二个最后一个字符,以避免IndexOutOfBounds。对于substring
,请将i+2
作为第二个参数。
总的来说,您必须将代码更改为以下内容:
int count=0;
for(int i=0; i < small(a, b).length()-1; i++)
{
String aSub=a.substring(i,i+2);
String bSub=b.substring(i,i+2);
if(aSub.equals(bSub))
count++;
}
}
return count;
为什么我询问字符串的长度,在循环中创建长度为2的子字符串可能会变得昂贵。对于较小字符串的长度n
,您将创建2 * n
子字符串。
我宁愿不创建子字符串,只是按字符匹配,同时跟踪前一个字符是否匹配。在您的情况下,这将完全正常,因为要匹配的子字符串的长度为2
。代码就像:
String a = "iaxxai";
String b = "aaxxaaxx";
boolean lastCharacterMatch = false;
int count = 0;
for (int i = 0; i < Math.min(a.length(), b.length()); i++) {
if (a.charAt(i) == b.charAt(i)) {
if (lastCharacterMatch) {
count++;
} else {
lastCharacterMatch = true;
}
} else {
lastCharacterMatch = false;
}
}
System.out.println(count);
答案 1 :(得分:0)
问题的核心在于您使用substring方法。需要注意的重要一点是,起始索引是包含性的,而结束索引是独占的。
作为一个例子,在循环的第一次迭代中解析你的用法String aSub=a.substring(i,i+1);
i = 0所以这一行是String aSub=a.substring(0,1);
从javadocs和我上面的解释,这将导致从第一个字符到第一个字符的子字符串或String aSub="x";
将此更改为i+2
和u+2
将获得所需的行为,但要注意索引越界错误以及当前循环的方式写入。
答案 2 :(得分:0)
String a = "xxcaazz";
String b = "xxbaaz";
int count = 0;
for (int i = 0; i < (a.length() > b.length() ? b : a).length() - 1; i++) {
String aSub = a.substring(i, i + 2);
String bSub = b.substring(i, i + 2);
if (aSub.equals(bSub)) {
count++;
}
}
System.out.println(count);