我写的代码似乎看起来很糟糕,用渐近测量运行时间和空间 我得到 T(N)= T(N-1)* N + O ((N-1!)* N)其中N是输入的大小。我需要建议去优化它置换一个字符串打印所有可能的字
因为它是我们要实现最有效的方式在逻辑所需的基于算法的面试问题,而无需使用任何库
这里是我的代码
def str_permutations(str_input,i):
if len(str_input) == 1:
return [str_input]
comb_list = []
while i < len(str_input):
key = str_input[i]
if i+1 != len(str_input):
remaining_str = "".join((str_input[0:i],str_input[i+1:]))
else:
remaining_str = str_input[0:i]
all_combinations = str_permutations(remaining_str,0)
for index,value in enumerate(all_combinations):
all_combinations[index] = "".join((key,value))
comb_list.extend(all_combinations)
i = i+1
return comb_list
你能解决复发关系吗?我忘了怎么做。另外,当你说“排列......打印所有......组合”时,我假设你实际上并不是指组合(因为只有n个组合的n个组合),而是指所有排列组合?鉴于有n!一个字符串在n个不同的(!)字母上的排列,在一般情况下(时间和空间)都不会低于指数复杂度;但是在实际创建排列之前,您可以为每个字符计算出现的次数。 –
说k_i是字符串中字母i的出现次数;事先对外观进行计数(使用直方图的线性时间和空间),您将为“字符串中的所有字符i”保存“product over k_i!”因子(注意阶乘)。 –
@ G.Bach谢谢你的回复,我想这很难再解决,但我同意你的观点,因为这个问题需要所有的排列组合,它不能小于n!并且对于正在运行的程序肯定会有更多的复杂性,但是我的程序的运行时间看起来很糟糕,我猜 – Sandy