置换字符串以打印所有可能的单词

时间:2013-03-28 17:37:53

标签: python algorithm

我写的代码似乎看起来很糟糕,渐近测量运行时间和空间 我正进入(状态 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

2 个答案:

答案 0 :(得分:2)

正如我在对该问题的评论中提到的,在一般情况下,由于n个不同的字符,输入字符串有n!个排列,因此您不会低于指数复杂度。 (2 n )是O(n!)的子集。

现在,以下内容不会改善一般情况的渐近复杂度,但是您可以优化蛮力方法,为具有多个出现次数的字符串生成所有排列。以字符串daedoid为例;如果你盲目地产生它的所有排列,你会得到每个排列6 = 3!次,因为你有三次出现d。您可以通过首先消除同一个字母的多次出现来避免这种情况,而是记住使用每个字母的频率。因此,如果有一个字母c出现k c ,您将保存k c !排列。总而言之,这为您节省了“产品超过k c !for all c”的因素。

答案 1 :(得分:0)

如果您不需要自己编写,请参阅itertools.permutationscombinations