一、题目
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
二、思路
参考有重复数字的全排列:
https://blog.csdn.net/weixin_45594025/article/details/105276676
先将给定的字符串转换成字符数组,然后用有重复数字的全排列的求解方法,求解字符这一组字符的全排列,最后将排列结果再合成字符串输出。
三、代码
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<>();
if(str.length() == 0)
return result;
// 1.字符串转换成字符数组并排序
char[] c = str.toCharArray();
Arrays.sort(c);
// 2.求这一组字符的全排列
ArrayList<ArrayList<Character>> list = new ArrayList<>();
boolean[] used = new boolean[c.length];
backTrack(list, new ArrayList<Character>(), c, used);
// 3.将求得的字符的排列合成字符串输出
ArrayList<Character> temp = new ArrayList<>();
for(int i = 0; i < list.size(); i++){
temp = list.get(i);
StringBuilder sb = new StringBuilder();
for(int j = 0; j < temp.size(); j++){
sb.append(temp.get(j));
}
result.add(sb.toString());
}
return result;
}
public void backTrack(ArrayList<ArrayList<Character>> list, ArrayList<Character> tempList, char[] c, boolean[] used){
if(tempList.size() == c.length){
list.add(new ArrayList<>(tempList));
}else{
for(int i = 0; i < c.length; i++){
if(used[i])
continue;
if(i > 0 && c[i] == c[i - 1] && used[i - 1] == false)
continue;
used[i] = true;
tempList.add(c[i]);
backTrack(list, tempList, c, used);
used[i] = false;
tempList.remove(tempList.size() - 1);
}
}
}
}