按字典顺序打印排列

时间:2016-07-08 00:46:56

标签: algorithm permutation

以字典顺序打印字符串的所有排列

  1. 我可以找到字符串的所有排列然后对其进行排序吗? 这只是时间复杂度O(n!) - >用于查找排列,然后对其进行排序O(nlogn)(如果快速排序或合并被视为排序算法)。 O(n!)+O(nlogn)会很复杂。

  2. geeksforgeeks给出的解决方案 http://www.geeksforgeeks.org/lexicographic-permutations-of-string/ 这称为O(n*n!)

  3. 我在https://www.educative.io/page/11000001/90001

  4. 找到了另一个解决方案

    有人可以解释哪些是最好的,以及时间的复杂性是什么?请解释

1 个答案:

答案 0 :(得分:3)

如果您确定所有排列然后对其进行排序,那么您的时间复杂度就会有所下降。假设您有一个n字符长字符串。根据快速搜索(complexity of recursive string permutation functionTime complexity of this code to list all permutations?)中的一些资源,确定排列的时间复杂度为Theta(n*n!)

这将生成n!个不同的排列。现在,要对这些排列进行排序,需要Theta(n! lg n!),总时间复杂度为:

Theta(n*n!) + Theta(n! lg n!)

您可以通过构建生成排列的算法来保留排序顺序,从而无需在最后进行那种昂贵的排序。

我想象一些递归算法,它将每个连续的字符作为排列的初始字符,然后确定字符串其余部分的排列(也将被排序)。

喜欢(对于部分伪代码,部分是Python):

def sorted_permute(str):
    if len(str) == 1:
        return [str]
    all_permutations = []
    for pos in len(str):
        next_str = str[:pos] + str[pos+1:]
        permutations = sorted_permute(next_str)
        permutations.prepend_to_all(str[pos])    # This could be expensive
        all_permutations.append(permutations)
    return all_permutations

***** 编辑 *****

如果您不想存储排列并且您真的只关心打印排列,您可以执行以下操作:

def sorted_permute(str, head):
    if len(str) == 0:
        print(head)
    for pos in len(str):
        next_str = str[:pos] + str[pos+1:]
        new_head = head + str[pos]
        sorted_permute(next_str, new_head)