Algorithm 一个字符串中的字符包含在另一个字符串中

Algorithm 一个字符串中的字符包含在另一个字符串中,algorithm,Algorithm,如何验证一个字符串中的每个字符是否包含在另一个字符串中。 例如,abc是string1,cbade是string2,string1中的所有字符(a b c)都包含在string2中。 实际上,它看起来很简单,但我们需要最快的方法来实现这一点,所以仍然非常困难,我花了整整一周的时间无法找到一个解决方案。如果您使用的是一种可以轻松为字符指定数值的语言(大多数语言),您可以通过查找表进一步加快速度: 查找表,每个字符一个槽 访问查找表中string2中的字母 确保访问了string1中的字母 利润

如何验证一个字符串中的每个字符是否包含在另一个字符串中。 例如,abc是string1,cbade是string2,string1中的所有字符(a b c)都包含在string2中。
实际上,它看起来很简单,但我们需要最快的方法来实现这一点,所以仍然非常困难,我花了整整一周的时间无法找到一个解决方案。

如果您使用的是一种可以轻松为字符指定数值的语言(大多数语言),您可以通过查找表进一步加快速度:

  • 查找表,每个字符一个槽
  • 访问查找表中string2中的字母
  • 确保访问了string1中的字母
  • 利润
  • 运行时间:A+B
    运行空间:A+B+N,其中N是可能的字符数。(C:256,Java:65536)

    如果没有,您应该能够在字符之间建立任意顺序,在这种情况下:

  • 按字母顺序对两个字符串进行排序
  • 二进制搜索(您可以使用最后找到的匹配项的位置作为非常好的初始猜测)
  • 利润
  • 运行时:A*log(A)+B*log(B)+A*log(B)

    运行空间:A+B

    将两个字符串中的所有字符分为两组,然后检查其中一组是否是另一组的子集。在Python中:

    >>> set("abc").issubset(set("cbade"))
    True
    

    你可以在O(n)中这样做。首先构造第二个字符串中存在的字符的哈希表。然后迭代第一个字符串中的字符,并断言该字符在哈希表中有一个条目。

    因为可能的字符数很小(假设为256),所以可以有一个大小为256的固定数组,首先将其每个位设置为零,然后在访问第一个字符串中的任何字符时,将数组中的相关位设置为零,在遍历第二个数组之后,如果您看到没有要设置的位,则表示它们都在前一个字符串中,您可以说第二个字符串的所有字符都在第一个字符串中可用,否则,如果您看到第二个字符串中的某个字符的相关位尚未设置,则可以说第一个字符串不包含第二个字符串。该算法在时间上是O(n),在内存中是O(1)(即O(1)外部内存)

  • 生成哈希映射(将字符映射到布尔值)
  • 迭代string1,在哈希表中为每个字符创建一个条目
  • 在string2上迭代,为您看到的每个字符将哈希表中的条目设置为true
  • 迭代哈希映射中的元素(在我知道的大多数实现中可能是,应该是O(n),即O(A)),如果看到false条目,停止并返回false,否则返回true
    =>
    时间:O(A+B),A是string1的长度,B是string2的长度
    空格:O(A)

    假设:在字符串/hashmap:O(n)时间上迭代,在hashmap:O(1)中查找/插入[注意,这些可能都是摊销的]

  • 这是可行的,但是排序对于这个问题来说是不必要的复杂。集合查找开销也可以说是昂贵的。我不明白为什么有人对此投了反对票。这是一种非常合理的方法,可以很好地扩展到非常大的字符串,恒定的运行时和运行空间大致与字符串的复杂性成比例。这是为什么?如果这是一个面试问题,那么他们可能正在寻找哈希/查找表解决方案(实际上,它们在不同的哈希函数中是相同的)。如果你真的在寻找最快的实现,你可以进行优化以加快实现速度。而且,我不知道为什么所有人都对答案投反对票,特别是在没有提供替代解决方案的情况下。它们都是非常有效的解决方案。第一个字符串,即您希望在另一个字符串中找到其字符的字符串,是否会有重复的字符?如果是,其他字符串是否必须具有相同的多重性(至少)以满足要求?