匹配两个字符串中长度为 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+2u+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);