一个字符串中的字符包含在其他字符串中

时间:2012-10-02 15:04:51

标签: algorithm

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

5 个答案:

答案 0 :(得分:0)

如果您使用的语言可以轻松地为字符分配数值(大多数语言),您可以使用查找表进一步加快速度:

  1. 查找表,每个字符一个插槽
  2. 访问查找表中string2中的字母
  3. 确保访问string1中的字母
  4. ???
  5. 利润
  6. 运行时:A + B
    运行空间:A + B + N,其中N是可能的字符数。 (C:256,Java:65536)

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

    1. 按字母顺序对两个字符串进行排序
    2. 二分搜索(你可以使用最后找到的匹配的位置作为一个非常好的初始猜测)
    3. ???
    4. 利润
    5. 运行时:A * log(A)+ B * log(B)+ A * log(B)
      运行空间:A + B

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以在O(n)中执行此操作。首先构造第二个字符串中存在的字符的哈希表。然后迭代第一个字符串中的字符并断言该字符在哈希表中有一个条目。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  1. 制作哈希图(字符映射到布尔值)
  2. 遍历string1,在每个字符的哈希表中创建一个条目
  3. 遍历string2,将哈希表中的条目设置为对于您看到的每个字符都为true
  4. 迭代哈希映射中的元素(在我知道的大多数实现中可能是O(n),即O(A)),如果看到false entry则停止并返回false,否则返回true
    =>
    时间:O(A + B),A是string1的长度,string2的B
    空间:O(A)

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