题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:看做一个递归问题;
- 求所有可能出现在第一个位置的字符,即将第一个位置的字符依次和后面的每一个字符进行交换;
- 固定第一个字符,对后面的字符进行全排列。即对后面的字符进行递归;
对于递归来说:
- 终止条件就是只剩最后一个元素的的时候;
- 递归内容是对除去第一个元素之后的元素进行递归;
代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class Solution {
ArrayList<String> list=new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
if(str==null||str.length()==0){
return list;
}
char[] chars = str.toCharArray();
Permutation(chars,0);
Collections.sort(list);
return list;
}
public void Permutation(char [] chars,int i){
if(i==chars.length-1){
//向列表中添加字符串
list.add(String.valueOf(chars));
}else{
Set<Character> charSet = new HashSet<Character>();
for(int j=i;j<chars.length;j++){
if(j==i||!charSet.contains(chars[j])){
charSet.add(chars[j]);
//将第一个元素和后面的元素交换位置
swap(chars,j,i);
//对除去第一个元素之外的元素递归
Permutation(chars,i+1);
//开始下一个元素交换之前,先将之前交换的的元素交换回来
swap(chars,i,j);
}
}
}
}
public void swap(char [] chars,int a,int b){
char temp=chars[a];
chars[a]=chars[b];
chars[b]=temp;
}
}