字符串的排列
Last updated
Last updated
问题简述
思路1:N叉树的前序遍历
排列的一般思路(假设无重复):
第 1 位有 n 种可能,固定第 1 位后第 2 位有 n-1 种可能、固定前 2 位后第 3 位有 n-2 种可能、...、固定前 n - 1 位后第 n 位有 1 种可能;
即时间复杂度为 O(n!)
,如果无法理解O(n!)
的含义,就很可能写出错误的代码;
具体来说,以 [1,2,3]
为例,第一位有 3 种可能,当固定第一位为 1
时,第二位有 [2,3]
两种可能,当固定第一位为 2
时,第二位依然有两种可能 [1,3]
;
写法1)基于枚举(剪枝需要排序)
使用一个全局变量记录已经用过的字符;
写法 2 不需要排序,写起来也更简单;但是写法 1 可以返回字典序的排序,写法 2 做不到;
思路2:下一个排列
先排序得到最小的字典序结果;
循环直到不存在下一个更大的排列;
下一个排列 思路:
为了使下一个排列更大,一个方法是将一个左边的「较小数」与一个右边的「较大数」交换;
而为了使变大的幅度最小,需要让这个「较小数」尽量靠右,而「较大数」尽可能小。
实现起来并没有那么直观,详见代码;