首页 > 解决方案 > 用双打和子集查找子集的有效算法是在一起的

问题描述

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

A = abcd B = hbadcg

A = aabc B = abcag

不被接受的例子

A = aabcd B = adcbga

A = abcd B = abbcdg

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

标签: javaarraysalgorithmsubsetletter

解决方案


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

  • 将 A 中每个字符的计数存储在哈希图中 -HashMapA
  • 在我们遍历数组 B 时维护两个指针,start 和 end。
  • 维护另一个哈希映射来存储出现在数组 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;

推荐阅读