【问题标题】:Find whether each character in 1 string is exist in another string, faster than O(n^2)查找 1 个字符串中的每个字符是否存在于另一个字符串中,比 O(n^2) 快
【发布时间】:2016-12-12 04:45:49
【问题描述】:

鉴于这两个字符串:

String stringA = "WHATSUP";
String stringB = "HATS";

我想知道stringB中的每个字符HATS是否存在于stringA

在初级方法中,该过程可以在嵌套的 for 循环中完成,其计算复杂度为 O(n^2)。

for(int i = 0; i < stringA.length(); i++){
    for(int j = 0; j < stringB.length(); j++){
        if(stringA.charAt(i) == stringB.charAt(j))
            //do something
    }
}

我正在寻找更快的解决方案来解决这个问题。

【问题讨论】:

  • 这看起来像是一道作业题;但您可以简单地为两个字符串创建哈希集并使用 containsAll

标签: java compare subset complexity-theory computation


【解决方案1】:

有一个线性时间算法。

  1. 将您的 stringA 转换为具有 O(1) 成员资格测试的字符哈希集。
  2. 遍历stringB 中的每个字符。
  3. 如果其中一个字符不在您的哈希集中,则测试失败。
  4. 如果没有失败,则测试成功。

【讨论】:

  • 如果stringA 明显长于stringB,,从长远来看,转换不会减慢进程吗?
  • @Nerdizzle:是的,使用这种方法可能会使特定情况变慢。
  • 你不能只创建两个哈希集并使用containsAll()吗?
  • @NullUserException:你可以这样做。它具有相同的时间复杂度。
  • 有趣的方法。如果使用 bitset 可以改善这一点,我会很感兴趣。其中 char 的值或预定义的字母表/charScheme 中的位置决定了 BitSet 中的位置/偏移量。如果允许使用有限的字符(例如,只有字母表),它可能比使用 HasSet 更有效。
猜你喜欢
  • 2012-12-07
  • 2016-02-16
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2012-11-23
  • 2019-05-11
相关资源
最近更新 更多