给定2个字符串a和b,返回它们包含相同长度2子字符串的位置数

时间:2018-07-05 11:39:19

标签: java

这是我对上述问题的代码。我很想知道为什么代码不能在所有情况下都起作用,例如:

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;
}

5 个答案:

答案 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;

}