在CTCI(Python版本)中,以下代码的运行时描述为O(N)
# O(N)
def unique(string):
# Assuming character set is ASCII (128 characters)
if len(string) > 128:
return False
char_set = [False for _ in range(128)]
for char in string:
val = ord(char)
if char_set[val]:
# Char already found in string
return False
char_set[val] = True
return True
这真让我感到困惑,因为我看到列表理解是char_set
的形成,而在……之后另一个for循环……运行时间不应该是O(N ^ 2)吗?
编辑:关于Laakman为什么使用len(string)> 128检查ascii字符,我也感到困惑。难道不是只给出所讨论字符串的长度,而不是Python中ord
方法所给出的字符值吗?
Edit1:如果她不使用val = ord(char)
,是否可以实现相同的目的?这样会将下一行更改为if char_set[char]:
答案 0 :(得分:1)
[False for _ in range(128)]
花费的时间是固定的,因此时间复杂度为O(1)
。
答案 1 :(得分:1)
对于第二个问题,关键是该代码旨在检查字符串中的每个字符是否唯一。假定该字符串是ASCII,则如果长度超过128个字符,则可能不能仅包含唯一字符,因为ASCII字符集中的开头只有128个字符。