题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路解析:
图片来自:https://blog.csdn.net/xydian/article/details/51255289
- 首先,判空,长度是否为0
- 然后用递归的方法,让第一个字母和其他字母进行交换,(不一样的字母就可以交换),然后第二个字母也要和后边的字母逐一进行交换。图中橘黄色的部分是固定不变的。
- 注意交换的过程中需要把交换的字母复位,也就是abcd的a分别交换bacd后应该还原回来,否则就是b和下一个c交换了。
- 还有递归的结束是当交换的字母是最后一个的时候,此时就停止交换了。
代码:
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res =new ArrayList<String>();
if(str!=null&&str.length()>0){
CharSort(str.toCharArray(),0,res);
Collections.sort(res);
}
return res;
}
private void CharSort(char[] ch,int start,ArrayList<String> res){
char data;
if(start==ch.length-1){//递归结束条件
res.add(String.valueOf(ch));
}else{
for(int i=start;i<ch.length;i++){
if(i==start||ch[i]!=ch[start]){//交换的条件
data=ch[start];//依次交换
ch[start]=ch[i];
ch[i]=data;
CharSort(ch,start+1,res);//递归
data=ch[start];//复位
ch[start]=ch[i];
ch[i]=data;
}
}
}
}
}