def scramble(s1, s2):
arrs1 = list(s1)
arrs2 = list(s2)
if all(True if arrs2.count(item) <= arrs1.count(item) else False for
item in arrs2):
return True
else:
return False
我正在尝试创建一个函数,该函数可以测试是否可以重新排列一部分字符串字符(str1)以匹配另一个字符串(str2)。
这不是O(n)吗?
答案 0 :(得分:3)
发布的代码实际上是O(n^2)
:
all(True if arrs2.count(item) <= arrs1.count(item) else False for item in arrs2)
all
需要对输入进行一次传递,从而产生O(n)
的时间复杂度。但是,每次通过时,item
在arrs2
中发生的次数必须为arrs1
。 count
的复杂度为O(n)
,因为还必须遍历列表对象以查找每次出现的期望值。 count
方法被调用了两次,但是它的平均时间复杂度接近O(n)
。因此,完整的表达式为O(n)*O(n) => O(n^2)
。
答案 1 :(得分:2)
要扩展Ajax的答案,不带all
语句的代码应如下所示:
def scramble(s1, s2):
arrs1 = list(s1)
arrs2 = list(s2)
are_counts_lte = []
for item in arrs2:
# this next "count" statement makes it O(n^2)
if arrs2.count(item) <= arrs1.count(item):
are_counts_lte.append(True)
else:
are_counts_lte.append(False)
for b in are_counts_lte:
if b is False: return False
return True
这显然是 O(n ^ 2)。
答案 2 :(得分:1)
如果您想要平均时间复杂度为O(n)的解决方案,则可以改用master
:
... new { htmlAttributes = new { @class = "form-control text-center lt-spinner number-quantity", @min ="0", @max = "4", ...