java - 匹配两个字符串中长度为 2(同一索引)的子序列

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

最佳答案

为了修复您的解决方案,您实际上不需要内部循环。由于两个字符串中的子字符串的索引应该相同,因此只需要一个循环。

此外,您应该迭代直到较小字符串的倒数第二个字符,以避免 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);

关于java - 匹配两个字符串中长度为 2(同一索引)的子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28703129/

相关文章:

java - 应用程序内的区域设置更改不起作用

java - AES 加密的 88 字节输出

linux - 寻找一个奇怪的特定 bash 脚本的灵感

string - 将空字符串转换为 null 的 Groovy 方法

java - 二维数组中的循环

loops - Powershell/PowerCLI 循环、超时和退出

java - Java 是否支持默认参数值?

java - 使用 Spring 转换器

arrays - 给定一个字符串数组,如果每个字符串都可以连接到其他字符串,则返回 true

c# - 将字符串数组转换为 double 组