在两个字符串中匹配长度为2(在相同索引处)的子序列

时间:2015-02-24 18:09:28

标签: java string loops for-loop substring

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

3 个答案:

答案 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+2u+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);