题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:先想一下如果只有一个字母,那么直接返回这个字符串。如果有两个不同的字母,则分别返回它们的组合,如果有三个字母,则分别拿出每一个,再和其它两个组合。。。。。。这样就构成了递归。
import java.util.ArrayList;
import java.util.Iterator;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList();
String[] split = str.split("");//分割字符串
handleString(split,result);//调用的开始
return result;
}
public ArrayList<String> handleString(String[] array,ArrayList<String> list){
if(array!=null&&array.length>0){
if(array.length==1){//当只有一个字母,判空后装入这个字母
if(!"".equals(array[0])){
list.add(array[0]);
}
}else{
for(int i=0;i<array.length;i++){//否则分别拿出每一个
ArrayList<String> tempList = new ArrayList();
//获取除了本字母的子数组来进行递归,比如abc,则用bc进行递归
//然后把结果装到集合里面。
handleString(getSubArray(array,i),tempList);
for(String str:tempList){
String temp = array[i]+str;//把结果集和当前字符进行组合,可得到例如abc,acb
if(!list.contains(temp)){//去重
list.add(temp);
}
}
}
}
}
return list;
}
public String[] getSubArray(String[] array,int index){//获取除了本字母的子数组
if(array!=null){
if(index<array.length&&index>=0){
String[] result = new String[array.length-1];
for(int i=0;i<array.length;i++){
if(i<index){
result[i] = array[i];
}else if(i==index){
continue;
}else{
result[i-1] = array[i];
}
}
return result;
}
}
return null;
}
}