一、题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
注意:
1、题目要求按照字典序打出排列(如果使用的数据结构不具有自动排序的功能,则需要考虑排序问题)
2、输入的字符可能有重复字符(不考虑的话通过率20%)
二、思路分析及代码实现
我们把字符串放入字符数组中,然后从第一位开始依次用后面的字符替换,然后考虑后面的全排列,在这里没有考虑重复的问题,因此我们最后交换得到的字符串一定存在重复,我们在添加到list之前才考虑重复问题。
最后需要考虑字典序列。使用Collections.sort(list);
实现。
import java.util.*;
public class Solution {
ArrayList<String> list=new ArrayList<>();
public ArrayList<String> Permutation(String str) {
if(str.length()==0) return list;
char array[]= str.toCharArray();
getFullpermutation(array,0,array.length);
//对list中的元素排序
Collections.sort(list);
return list;
}
public void getFullpermutation(char[] array,int start, int end){
if(end<0)
return;
if(start==end){
ArrtoStr(array);
}else{
for(int i=start;i<end;i++){
swap(array,i,start);
getFullpermutation(array,start+1,end);
swap(array,start,i);
}
}
}
public void swap(char[] array, int i, int j){
char ch=array[i];
array[i]=array[j];
array[j]=ch;
}
public void ArrtoStr(char[] array){
String str="";
for(int i=0;i<array.length;i++)
str=str+Character.toString(array[i]);
if(!list.contains(str))
list.add(str);
}
}