这是我对上述问题的代码。我很想知道为什么代码不能在所有情况下都起作用,例如:
System.out.println(stringMatch("aabbccdd", "abbbxxd")); // Should be 1, but was 3
System.out.println(stringMatch("aaxxaaxx", "iaxxai")); // Should be 3, but was 5
System.out.println(stringMatch("iaxxai", "aaxxaaxx")); // Should be 3, but was 5
public int stringMatch(String a, String b) {
int counter = 0;
for (int i = 0; i < a.length() - 1; i++) {
for (int j = 0; j < b.length() - 1; j++) {
String aSub = a.substring(i, i + 2);
String bSub = b.substring(j, j + 2);
if (aSub.equals(bSub)) {
counter++;
}
}
}
return counter;
}
答案 0 :(得分:1)
正如Ashu所说,您的程序实际上是在计算长度为2的相同字符串的数量。
以您提到的第一个示例为例。 aabbccdd,abbbxxd
因此,您的for循环的结构方式是将“ aa”子字符串与第二个字符串“ abbbxxd”中的每个两个字母子字符串进行比较
最后,您将ab与ab匹配,将bb与bb匹配,将bb与bb再次匹配, (因为第二个字符串中有3个b),因此输出为3,实际上它应该为1,因为只有一个bb与相同位置(第三个字母和第四个字母)匹配
答案 1 :(得分:0)
一个错误是< ?.length() - 2
,因为迭代是针对i+2 < length()
的。
答案 2 :(得分:0)
该问题要求您将两个字符串彼此相邻放置,并检查它们具有两个相同字符集的多少个位置(请注意,它们可能会重叠)。换句话说:
aabbccdd aaxxaaxx iaxxai
abbbxxd iaxxai aaxxaaxx
--^^---- (1) -^^^^--- (3) -^^^^--- (3)
(bb) (ax, xx, xa) (ax, xx, xa)
正如您希望看到的那样,您只需执行一个循环即可,因为您总是比较String a和String b的相同索引。但是您的代码有2个循环。什么是检查字符串a的任何两个字符是否在字符串b中的任何地方:
for string "aabbccdd":
Iteration i1: Iteration i2: Iteration i3: Iteration i4: etc...
abbbxxd abbbxxd abbbxxd abbbxxd
aa (0) ab (1) bbb (2) bc (0)
您需要摆脱第一个循环,然后修复循环,直到最短的String结束之前的2为止,这样您就不会出现ArrayIndexOutOfBoundsException:
public int stringMatch(String a, String b) {
int counter = 0;
for(int i = 0; ((i < a.length() - 2) && (i < b.length() -2)); i++){
String aSub = a.substring(i, i + 2);
String bSub = b.substring(i, i + 2);
if(aSub.equals(bSub)){
counter++;
}
}
return counter;
}
感谢Faaiz Haque在我的for语句中发现错误!这两个语句必须为true,循环才能继续运行。
答案 3 :(得分:0)
public static int stringMatch(String a, String b) {
int counter = 0;
for (int i = 0; i < a.length() - 1; i++) {
for (int j = 0; j < b.length() - 1; j++) {
String aSub = a.substring(i, i + 2);
String bSub = b.substring(j, j + 2);
if (aSub.equals(bSub)) {
System.out.println(aSub);
counter++;
}
}
}
return counter;
}
public static void main(String[] args) {
System.out.print(stringMatch("aabbccdd", "abbbxxd"));
System.out.println("****");
System.out.println(stringMatch("aaxxaaxx", "iaxxai"));
System.out.println("****");
System.out.println(stringMatch("iaxxai", "aaxxaaxx"));
}
使用上面的代码生成子字符串匹配项。生成的输出如下:
ab
bb
bb
3
****
ax
xx
xa
ax
xx
5
****
ax
ax
xx
xx
xa
5
依次,根据您的代码,这是正确的输出。如果希望对匹配的子字符串进行唯一计数,则可以尝试将子字符串插入集合中,并返回集合的大小作为函数的输出。
答案 4 :(得分:0)
首先,您应该找到更大的字符串:
String tempA = "";
String tempB = "";
if (a.length() > b.length()){
tempA = a;
tempB = b;
}else{
tempA = b;
tempB = a;
}
然后,您需要控制某些特殊情况,例如当i等于aTemp.length()-1
或j等于bTemp.length()-1
时。在这种情况下,aTemp.substring(i, i + 2);
和bTemp.substring(j, j + 2);
语句会出错。
我应该迭代直到aTemp.length()-2
j应该迭代直到bTemp.length()-2
您需要存储找到的位置以避免重复计数(我确实是通过使用ArrayList)
对于此示例:stringMatch(“ iaxxai”,“ aaxxaaxx”) 答案必须是3:
ax:i ax xai a ax xaaxx
xx:ia xx ai aa xx aaxx
xa:iax xa i aax xa axx
public static int stringMatch(String a, String b) {
ArrayList<String> list = new ArrayList<String>();
int counter = 0;
String tempA = "";
String tempB = "";
if (a.length() > b.length()){//to find the bigger string
tempA = a;
tempB = b;
}else{
tempA = b;
tempB = a;
}
for(int i = 0; i < tempA.length() - 2; i++){
for(int j = 0; j < tempB.length() - 2; j++){
String aSub;
String bSub;
if (i == tempA.length() - 2){//when i == tempA.length() - 2 you need to take the substring(i to end of the string)
aSub = tempA.substring(i);
}else{
aSub = tempA.substring(i, i + 2);
}
if (j == tempB.length() - 2){
bSub = tempB.substring(j);
}else{
bSub = tempB.substring(j, j + 2);
}
if(aSub.equals(bSub) && list.indexOf(aSub) == -1 ){//list.indexOf(aSub) == -1 means there is no element in the list
list.add(aSub);//or bSub
counter++;
}
}
}
return counter;
}