1、题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
2、思路:解决这道题首先就要自己手写一遍所有可能性,并总结出规定的步骤才能解题,这道题分为两步,
输入:abc
第一步:列出字符串的第一个位置所有可能出现的字符,主要的方式就是将第一个字符与后边所有的字符进行交换。
abc
bac
cba
第二步:固定第一个字符求后边所有字符的排列。对于后边部分的字符仍然采用将后边的字符分成两部分的方式,第一个字符和后边的字符依次交换顺序。
abc
acb
bac
bca
cba
cab
使用set进行去重
abc, bac , cba , acb , bca , cab
3、代码:
import java.util.*; public class Solution { public static ArrayListPermutation(String str) { if (str == null || str.length() == 0) { return new ArrayList<>(); }
//set用于结果去重 Setset = new TreeSet<>(); helper(str.toCharArray(), 0, set); return new ArrayList<>(set); }
//这一步代码没理解 public static void helper(char[] s, int i, Setset) { if (i == s.length) { set.add(String.valueOf(s)); } for (int j = i; j < s.length; j++) { swap(s, i, j); helper(s, i + 1, set); swap(s, i, j); } } public static void swap(char[] s, int i, int j) { if (i == j) return; char temp = s[j]; s[j] = s[i]; s[i] = temp; } }
注意:使用java和c++的思想一样,但实现方式不一样,不能完全照搬。