分析过程
我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。
编码思想
列出第一位所有可能情况,然后后面的位就递归,第一位和每个位(包括第一位但不包括其他位和一相等的)交换,递归的结束条件就是第一位和最后一位交换完成
具体代码实现
/**
* ch:字符串转化为的char数组
* begin:交换位置的索引
* set:用于存放字符串
*/
public void Permutation(char[] ch,int begin,TreeSet<String> set){
if(begin==ch.length-1)
set.add(String.valueOf(ch));//递归结束的条件就是,第一位和最后一位交换完成
for(int i=begin;i<ch.length;i++){//让第一位和每一位交换
if(i!=begin && ch[i]==ch[begin])//如果第一位和非第一位重复了,就不交换了
continue;
swap(ch,begin,i);
Permutation(ch,begin+1,set);//递归,第一位固定了,将除了第一位,后面的字符串全排序。
swap(ch,begin,i);//交换完成还要换回来,保证第一位不变
}
}