我在编码面试中遇到了这个问题:
typedef
这是一个经典的算法面试问题。我说我可以在# AAABB should return A3B2
时间和O(n)
空间解决此问题。
O(1)
我理解def compress(s):
output = ''
count = 1
for i in range(len(s)-1):
if s[i] == s[i+1]:
count+=1
else:
output = output + s[i] + str(count)
count=1
output = output +s[i+1] + str(count)
return output
compress('AAABB') #returns A3B2
空间意味着它与输入的大小成比例增长。所以我认为O(n)
空间看起来像
O(n)
。
我认为[(A,3),(B,2)]
位于A3B2
空间,因为它没有被分成多个字符串。
我现在意识到O(1)
和我的输出与我的输入大小不成比例地(更少)增长,所以说空格是n == len(s)
是否正确?
答案 0 :(得分:4)
必须计算您存储的输出字符串的长度。在最坏的情况下(没有连续的字符匹配),它实际上是输入的两倍。很明显它通常是 O ( n ):如果你知道长输入总是包含非常长的运行,那么它只会渐近地变得更好。 (在最好的情况下,所有字符都相同,并且数字的长度为 O (log n )。)
也就是说,将输出视为流(如print
)有时很有用,然后您的空间复杂度(对于count
和当前输入字符)是常量。当然,即使这样,它在技术上也是对数的,因为存储count
所需的位数是,但在实际分析中经常被忽略。