我有两个字符串。如何确定第一个字符串是否仅由第二个字符串给出的字母组成?
例如:
A = abcd
B = abbcc
应该返回false,因为d
不在第二个字符串中。
A = aab
B = ab
应该返回true。
如果程序大部分时间都返回false,我该如何优化该程序?如果它在大多数情况下都返回true,那么我该如何优化呢?
答案 0 :(得分:5)
对两个字符串进行排序。然后通过A,并有一个指针通过B.如果A中的字符与B指针所指向的相同,请继续查看A.如果A中的字符在字母表中的后面比B指针指向的字符to,推进B指针。如果A中的字符在字母表中早于B指针指向的字符,则返回false。如果用完A,则返回true。
答案 1 :(得分:3)
[我如何]确定[if]第一个字符串[由第二个字符串中出现的字符组成?]
这是一个快速算法:
S
和T
。S - T
。调用结果U
。如果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。