Algorithm 一个字符串中的字符包含在另一个字符串中
如何验证一个字符串中的每个字符是否包含在另一个字符串中。 例如,abc是string1,cbade是string2,string1中的所有字符(a b c)都包含在string2中。Algorithm 一个字符串中的字符包含在另一个字符串中,algorithm,Algorithm,如何验证一个字符串中的每个字符是否包含在另一个字符串中。 例如,abc是string1,cbade是string2,string1中的所有字符(a b c)都包含在string2中。 实际上,它看起来很简单,但我们需要最快的方法来实现这一点,所以仍然非常困难,我花了整整一周的时间无法找到一个解决方案。如果您使用的是一种可以轻松为字符指定数值的语言(大多数语言),您可以通过查找表进一步加快速度: 查找表,每个字符一个槽 访问查找表中string2中的字母 确保访问了string1中的字母 利润
实际上,它看起来很简单,但我们需要最快的方法来实现这一点,所以仍然非常困难,我花了整整一周的时间无法找到一个解决方案。如果您使用的是一种可以轻松为字符指定数值的语言(大多数语言),您可以通过查找表进一步加快速度:
运行空间:A+B+N,其中N是可能的字符数。(C:256,Java:65536) 如果没有,您应该能够在字符之间建立任意顺序,在这种情况下:
运行空间:A+B将两个字符串中的所有字符分为两组,然后检查其中一组是否是另一组的子集。在Python中:
>>> set("abc").issubset(set("cbade"))
True
你可以在O(n)中这样做。首先构造第二个字符串中存在的字符的哈希表。然后迭代第一个字符串中的字符,并断言该字符在哈希表中有一个条目。因为可能的字符数很小(假设为256),所以可以有一个大小为256的固定数组,首先将其每个位设置为零,然后在访问第一个字符串中的任何字符时,将数组中的相关位设置为零,在遍历第二个数组之后,如果您看到没有要设置的位,则表示它们都在前一个字符串中,您可以说第二个字符串的所有字符都在第一个字符串中可用,否则,如果您看到第二个字符串中的某个字符的相关位尚未设置,则可以说第一个字符串不包含第二个字符串。该算法在时间上是O(n),在内存中是O(1)(即O(1)外部内存)
=>
时间:O(A+B),A是string1的长度,B是string2的长度
空格:O(A)
假设:在字符串/hashmap:O(n)时间上迭代,在hashmap:O(1)中查找/插入[注意,这些可能都是摊销的]
这是可行的,但是排序对于这个问题来说是不必要的复杂。集合查找开销也可以说是昂贵的。我不明白为什么有人对此投了反对票。这是一种非常合理的方法,可以很好地扩展到非常大的字符串,恒定的运行时和运行空间大致与字符串的复杂性成比例。这是为什么?如果这是一个面试问题,那么他们可能正在寻找哈希/查找表解决方案(实际上,它们在不同的哈希函数中是相同的)。如果你真的在寻找最快的实现,你可以进行优化以加快实现速度。而且,我不知道为什么所有人都对答案投反对票,特别是在没有提供替代解决方案的情况下。它们都是非常有效的解决方案。第一个字符串,即您希望在另一个字符串中找到其字符的字符串,是否会有重复的字符?如果是,其他字符串是否必须具有相同的多重性(至少)以满足要求?