java - 寻找 double 子集的有效算法和子集在一起

标签 java arrays algorithm subset letter

<分区>

我有两个带有字母的数组。 我想知道数组 A 是否包含在数组 B 中,如下所示: A 中的字母必须在数组 B 中彼此相邻出现,但不必以与数组 A 中相同的顺序出现。 可以接受的例子

A = abcd B = hbadcg

A = aabc B = abcag

不被接受的例子

A = aabcd B = adcbga

A = abcd B = abbcdg

我能做的是检查 A 的每个变体是否是 B 中的子字符串。但我正在寻找更好的方法

最佳答案

考虑对给定的问题使用两点法。

  • 将 A 中每个字符的计数存储在 HashMap 中 - HashMapA
  • 在遍历数组 B 时维护两个指针,start 和 end。
  • 维护另一个 HashMap 以存储出现在数组 B 中 [start, end] 范围内的字符数 - HashMapB

相同的共享 ideone 链接:https://ideone.com/vLmaxL


for(char c : A) HashMapA[c]++;

start = 0
for(int end = 0; end < B.length(); end++) {
  char c = B[end];
  HashMapB[c]++;
  while(HashMapB[c] > HashMapA[c] && start <= end) {
    HashMapB[ B[start] ]--;
    start++;  
  }
  if(end - start + 1 == A.length())
    return true;
} 

return false;

关于java - 寻找 double 子集的有效算法和子集在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52687429/

相关文章:

c - 指向仅在 main() 内部工作的数组的指针

php - 将网页关键字与数据库中的一组关键字相匹配

algorithm - 棋盘上国王的最短路径

java - 使用图形 API 发布到 Facebook 用户的留言墙上

java - 获取XML数据后,如何解析它并转换为JSON?

javascript - 对象内部数字的总和

algorithm - 极坐标 -> 笛卡尔转换的快速算法

java - 使用 Spring 设计 Java 库

java - 在Java中,如何检查时间是否在两个日期对象之内

在 html 元素中过滤文本的 JavaScript 问题