匹配两个字符串中长度为 2(在同一索引处)的子序列
Matching subsequence of length 2 (at same index) in two strings
给定 2 个字符串 a 和 b,return 它们包含相同长度的 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;
}
问题的核心在于您对 substring 方法的使用。需要注意的是,开始索引是包含的,结束索引是不包含的。
作为一个例子,剖析你的用法,String aSub=a.substring(i,i+1);
在循环的第一次迭代中 i = 0 所以这一行然后是 String aSub=a.substring(0,1);
从 javadocs 和我上面的解释,这将导致在从第一个字符到第一个字符或 String aSub="x";
的子字符串中将其更改为 i+2
和 u+2
将使您获得所需的行为,但要注意循环方式中的索引越界错误目前正在写。
为了修复您的解决方案,您确实不需要内部循环。由于两个字符串中子字符串的索引应该相同,因此只需要一个循环。
此外,您应该迭代到较小字符串的倒数第二个字符,以避免 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);
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);
给定 2 个字符串 a 和 b,return 它们包含相同长度的 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;
}
问题的核心在于您对 substring 方法的使用。需要注意的是,开始索引是包含的,结束索引是不包含的。
作为一个例子,剖析你的用法,String aSub=a.substring(i,i+1);
在循环的第一次迭代中 i = 0 所以这一行然后是 String aSub=a.substring(0,1);
从 javadocs 和我上面的解释,这将导致在从第一个字符到第一个字符或 String aSub="x";
的子字符串中将其更改为 i+2
和 u+2
将使您获得所需的行为,但要注意循环方式中的索引越界错误目前正在写。
为了修复您的解决方案,您确实不需要内部循环。由于两个字符串中子字符串的索引应该相同,因此只需要一个循环。
此外,您应该迭代到较小字符串的倒数第二个字符,以避免 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);
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);