【问题标题】:Efficient algorithm for finding subset with doubles and subset is together [closed]用双精度和子集查找子集的有效算法是在一起的[关闭]
【发布时间】:2019-03-12 05:58:16
【问题描述】:

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

A = abcd B = hbadcg

A = aabc B = abcag

不被接受的例子

A = aabcd B = adcbga

A = abcd B = abbcdg

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

【问题讨论】:

  • 你应该展示你到目前为止所做的事情,并找出问题所在。否则问题太宽泛了。
  • 我最后写的是我能想到的唯一方法。这就是为什么我想知道是否有人知道更好的方法

标签: java arrays algorithm subset letter


【解决方案1】:

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

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

【讨论】:

  • 感谢@nlex 的答案。这是我能找到的最快的。我只想在开头添加如果 B 包含 A 则立即返回 true。但除此之外看起来不错!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多