一起查找具有双精度和子集的子集的高效算法

时间:2018-10-07 10:04:00

标签: 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中是子字符串。但我正在寻找更好的方法

1 个答案:

答案 0 :(得分:2)

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

  • 将每个字符的计数存储在哈希图中的A中-HashMapA
  • 在遍历数组B时,保持两个指针,即开始和结束。
  • 维护另一个哈希图以存储数组B-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;