题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:全排列问题
例如:输入字符串abc,先固定a,求bc的全排列;再把a和b交换位置,固定b,求ac的全排列;再把a和c交换位置,固定c,求ba的全排列
每个子问题的全排列都可以递归去求,直到只有一个元素为止
注意一:按字典顺序排序
注意二:去除重复
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList();
if(str ==null)
{
return result;
}
//字符串转换为字符串数组
char[] str_arr = str.toCharArray();
permu(str_arr,result,0,str_arr.length-1);
//按字典顺序打印输出
Collections.sort(result);
return result;
}
public void permu(char[] str,ArrayList<String> result,int from,int to)
{
if(from==to)
{
String complete = new String(str);
result.add(complete);
}
else{
for(int i=from;i<=to;i++)
{
//去除重复
if((i!=from)&&(str[i]==str[from]))
{
continue;
}
swap(str,i,from);
permu(str,result,from+1,to);
swap(str,i,from);
}
}
}
//交换顺序
public void swap(char[] str,int begin,int end)
{
char temp = str[begin];
str[begin]=str[end];
str[end]=temp;
}
}