题干
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路
我们先用日常的思路来求解。有些像在高中时候做排序组合时候,对于给定的三个数求其不同的排列顺序,我们通常做的就是说,先固定一个数字,然后求取剩下的数字的排序组合,然后将其插入其中例如将bc排序有bc与cb然后将a插入其中的三个位置就会有六种想要的结果。还有一种思想就是说我们将第一个数字与后面不断进行交换,每次的交换以后将剩余的两个进行一个排列就变成了3个两次的排列。
这里我们思考如何实现第二种方法:先是aa进行交换,相当于a进行一个固定。然后bc(后两个)交换得到两种结果,然后ab交换之后,b进行一个固定,然后ac(后两个)进行交换。最后ac交换,c进行固定,ab(后两个交换位置)
这个时候我们可以先写出部分伪代码
for(int i=j;i<num.length;i++){
swap(num,i,j);
}
private void swap(int num[],int i,int j){
}
然后就是对于后面部分的交换而言,我们就可以利用值的变化与递归来解决。代码如下
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> array=new ArrayList<String>();
all(str.toCharArray(),0,array);
Collections.sort(array);
return array;
}
private void all(char [] ch,int i,ArrayList<String> array)
{
if(i==ch.length-1){
String val=String.valueOf(ch);
if(!array.contains(val))
array.add(val);
}
else{
for(int j=i;j<ch.length;j++){
swap(ch,i,j);
all(ch,i+1,array);
swap(ch,i,j);
}
}
}
private void swap(char [] ch,int i,int j){
char temp=ch[i];
ch[i]=ch[j];
ch[j]=temp;
}
}
```