字符串的排列

last modify

字符串的排列_牛客题霸_牛客网

问题简述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

思路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)基于交换(剪枝不需要排序

    剑指 Offer 38. 字符串的排列(回溯法,清晰图解) - Krahets

    • 去重方法:在 dfs 内部记录使用过的字符;

  • 写法 2 不需要排序,写起来也更简单;但是写法 1 可以返回字典序的排序,写法 2 做不到;

Python 写法1)基于枚举
Python 写法2)基于交换

思路2:下一个排列

  • 先排序得到最小的字典序结果;

  • 循环直到不存在下一个更大的排列;

  • 下一个排列 思路:

    • 为了使下一个排列更大,一个方法是将一个左边的「较小数」与一个右边的「较大数」交换;

    • 而为了使变大的幅度最小,需要让这个「较小数」尽量靠右,而「较大数」尽可能小。

    • 实现起来并没有那么直观,详见代码;

Python

Last updated