如何确定字符串是否仅由第二个字符串给出的字母组成

时间:2010-02-16 22:09:58

标签: algorithm

我有两个字符串。如何确定第一个字符串是否仅由第二个字符串给出的字母组成?

例如:

A = abcd
B = abbcc

应该返回false,因为d不在第二个字符串中。

A = aab
B = ab

应该返回true。

如果程序大部分时间都返回false,我该如何优化该程序?如果它在大多数情况下都返回true,那么我该如何优化呢?

5 个答案:

答案 0 :(得分:5)

对两个字符串进行排序。然后通过A,并有一个指针通过B.如果A中的字符与B指针所指向的相同,请继续查看A.如果A中的字符在字母表中的后面比B指针指向的字符to,推进B指针。如果A中的字符在字母表中早于B指针指向的字符,则返回false。如果用完A,则返回true。

答案 1 :(得分:3)

  

[我如何]确定[if]第一个字符串[由第二个字符串中出现的字符组成?]

这是一个快速算法:

  1. 将第一个和第二个字符串视为两组字符ST
  2. 执行 set difference S - T。调用结果U
  3. 如果U非空,则返回false。否则,返回true。

答案 2 :(得分:2)

这是一个简单的方法。

def isComposedOf(A, B):
    bset = set(B)
    for c in A:
        if c not in bset:
            return False
    return True

此算法遍历每个字符串一次,因此它以O(len(A)+ len(B))时间运行。

如果答案是肯定的,即使在最好的情况下,你也不能比len(A)比较好,因为无论你必须检查每一个字母。在最坏的情况下,A中的一个字符隐藏在B中非常深。因此,就最坏情况的性能而言,O(len(A)+ len(B))是最优的。

类似地:当答案为否时,即使在最好的情况下,你也不能比len(B)比较好;在最坏的情况下,不在B中的字符在A中隐藏得非常深。所以O(len(A)+ len(B))再次是最优的。

您可以通过为bset使用更好的数据结构来减少常数因子。

你可以避免在某些(非最差)情况下扫描所有B,其中答案是肯定的,通过懒散地构建它,每次在A中找到你以前没见过的角色时扫描更多的B。

答案 3 :(得分:1)

>如果程序总是返回false,如何优化这个程序?

return false

>如果它总是返回true,如何优化它?

return true

编辑:说真的,这是一个很好的问题,什么算法优化失败的情况,以及什么算法优化成功案例。我不知道strstr使用什么算法,它可能是一个通常不错的算法,对于这两种假设都不是最佳的。

也许你会在这里找到一个随便知道的人。如果没有,这似乎是一个开始阅读的好地方:Exact String Matching Algorithms

答案 4 :(得分:0)

假设字符串中包含全部小写,那么您可以使用位向量并根据位置position = str1[i] - 'a'设置该位。设置它你会做什么 bitVector |= (1<<pos)。然后对于str2,您将检查是否在bitVector中为所有位设置了一个位,如果是,则返回true,否则返回false。