时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:585892
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路:
通过将数组中的元素交换实现全排列的效果,深搜后再进行回溯操作,把之前交换的数值再交换回来
AC代码:
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String>list=new ArrayList<>();
if(str.equals(""))return list;
int size=str.length();
dfs(list,0,str.toCharArray());
Collections.sort(list);
return list;
}
public void dfs(ArrayList<String>list,int index,char[] s)
{
if(index==s.length-1)list.add(new String(s));
for(int i=index;i<s.length;i++){
if(i==index||s[index]!=s[i]){
swap(s,i,index);
dfs(list,index+1,s);
swap(s,i,index);
}
}
}
public void swap(char[] c,int i,int j)
{
char t=c[i];
c[i]=c[j];
c[j]=t;
}
}