【题目描述】
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
时间限制:1秒 空间限制:32768K 热度指数:378352
本题知识点: 字符串
【解题思路】
把字符串分为两部分:一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符。
- 第一步是求所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符交换。(for循环、交换操作)
- 第二步是固定住第一个字符,求后面所有字符的排列。(递归)
- 而“求后面所有字符的排列”即可按照上面的思路递归进行。
实现借助一个char[],通过交换元素得到不同的排列,在递归返回时将其装入ArrayList。
如下图所示,有两点需要注意:
- 在每个分支进行完后,要将交换过的元素复位,从而不会影响其他分支。
- 因为有“Swap A with A”这样的操作,并且题目指出可能有字符重复,所以分支末尾可能有重复的序列,在加入ArrayList要进行去重判断,不重复再加入。
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
// 132ms 1186K