题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
递归:
递归的出口为只剩最后一个字符的时候,然后进行字符数组的全排列,但是注意一点就是,出现重复字符时需要跳过(举例,如aba:1位置与2位置交换后变为baa,当1位置后续与3位置交换时因为值一样所以不进行替换但是其后续排列也被截掉了,这时后续的排列外层指针指向在b时b位置的与a交换为abb,正好解决了外层指针在a时不能排列为abb的情况)
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList list = new ArrayList();
if(!str.isEmpty()){
getAllType(list,str.toCharArray(),0);
Collections.sort(list);
}
return list;
}
public void getAllType(ArrayList list , char[] chars,int index){
if(index == chars.length-1){ // 出口控制条件
list.add(String.valueOf(chars));
}else{ //进行全排列
Set<Character> set = new HashSet<Character>();
for(int j = index;j<chars.length;j++){
if(index==j||!set.contains(chars[j])){ // 按照上述思路循环内去除重复项干扰
set.add(chars[j]);
exchangeSub(chars,index,j);
getAllType(list,chars,index+1); // 剩余位置全排列
exchangeSub(chars,j,index); // 该指针位置排列完后恢复原有接口,防止影响其他排列
}
}
}
}
public void exchangeSub(char[] chars , int i , int j){
char tem = chars[i];
chars[i] = chars[j];
chars[j] = tem;
}
}