以字典顺序打印字符串的所有排列
我可以找到字符串的所有排列然后对其进行排序吗?
这只是时间复杂度O(n!) - >用于查找排列,然后对其进行排序O(nlogn)
(如果快速排序或合并被视为排序算法)。 O(n!)+O(nlogn)
会很复杂。
geeksforgeeks给出的解决方案
http://www.geeksforgeeks.org/lexicographic-permutations-of-string/
这称为O(n*n!)
有人可以解释哪些是最好的,以及时间的复杂性是什么?请解释
答案 0 :(得分:3)
如果您确定所有排列然后对其进行排序,那么您的时间复杂度就会有所下降。假设您有一个n
字符长字符串。根据快速搜索(complexity of recursive string permutation function,Time 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)