【问题标题】:Print Permutations in lexographical order按字典顺序打印排列
【发布时间】:2016-07-08 00:46:55
【问题描述】:

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

  1. 我可以找到一个字符串的所有排列然后排序吗? 这只是时间复杂度 O(n!) ->for find permutations 然后排序它是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找到了另一个解决方案

谁能解释其中哪些是最好遵循的,时间复杂度是多少?请解释

【问题讨论】:

  • 蛮力应该是O(n!),除非你能以某种方式修改排列生成算法以拒绝未排序的字符串,而无需做额外的工作。
  • 暴力是一种,即生成排列并对其进行排序?
  • 您不能拒绝任何字符串。每个单独的字符串都没有排序,但字符串的所有排列在打印之前都会排序。
  • 为什么要对所有排列进行排序?您可以对输入字符串进行排序,然后生成排列,如果正确完成,它们将自动按字典顺序排列。

标签: algorithm permutation


【解决方案1】:

如果您确定所有排列然后对其进行排序,那么您的时间复杂度会有所下降。假设您有一个 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)

【讨论】:

  • 谢谢你们的解释......这真的帮助了我:)
  • @user3519495 没问题。如果有帮助,我会为算法添加一些伪代码。
  • for (i=0; i<N; i++) { for(j=i; j<N; j++) { s = input.substring(i, j); if (!list.hasItem(s)) { list.addItem(s); }}} 这样就可以了,如果输入已排序,列表将按字典顺序排序。
  • 真的不需要存储排列,OP想要打印它们。此外,复杂性有一个更紧密的界限O(e.n!),我认为......
  • 所以如果我先对字符串进行排序然后生成排列...时间复杂度可能是多少。排序:O(nlogn)+排列:O(n * n!)......所以整体复杂度将是O(n!)......如果错了请纠正我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多