题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
结题思路:很明显这是一个全排列的问题但是我们要注意的是字符元素有可能会发生重复,对于这点我们可以有两种解决方式要么在判断是否交换时进行判断,要么在将结果加入返回容器时去除重复的数据,我使用的是通过set容器去除重复的元素。下面主要介绍如何获得数据的全排列,我们观察排列的整个过程都是先选定一个数放在第一位然后再选定一个数放在第二位直到所有的数都被选定。假设第一位的一个数不变,当后面其它位的数都排序完以后,将第一位的数和后面的数交换位置,而第二位的数也是如此,那么我们可以用递归的思想去解决该问题。AC代码如下:
import java.util.*;
public class Solution {
public void Permutation(char[] chars,int pos,TreeSet<String> result){
if(pos==chars.length){
result.add(String.valueOf(chars));
}
for(int i=pos;i<chars.length;i++){
char temp=chars[i];
chars[i]=chars[pos];
chars[pos]=temp;
Permutation(chars,pos+1,result);
temp=chars[i];
chars[i]=chars[pos];
chars[pos]=temp;
}
}
public ArrayList<String> Permutation(String str) {
ArrayList<String> result=new ArrayList<String>();
TreeSet<String> temp=new TreeSet<String>();//防止相同的两个元素“aa”
if(str==null || str.length()==0) return result;
char[] chars=str.toCharArray();
Permutation(chars,0,temp);
result.addAll(temp);
return result;
}
}