给定 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;
}
最佳答案
为了修复您的解决方案,您实际上不需要内部循环。由于两个字符串中的子字符串的索引应该相同,因此只需要一个循环。
此外,您应该迭代直到较小字符串的倒数第二个字符,以避免 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);
关于java - 匹配两个字符串中长度为 2(同一索引)的子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28703129/