一、题目描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例 1:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
二、解题
回溯
全排列问题,使用回溯。
class Solution {
public String[] permutation(String s) {
//升序
char[] schar = s.toCharArray();
Arrays.sort(schar);
List<String> res = new ArrayList<>();
StringBuffer per = new StringBuffer();
boolean[] visited = new boolean[schar.length];
dfs(res,per,schar,visited,0);
String[] ans = new String[res.size()];
for(int i = 0;i<res.size();i++){
ans[i] = res.get(i);
}
return ans;
}
public void dfs(List<String> res,StringBuffer per,char[] schar,boolean[] visited,int index){
//终止条件
if(index == schar.length){
res.add(per.toString());
return;
}
for(int i = 0;i<schar.length;i++){
//去重
if(visited[i] || (i > 0 && schar[i] == schar[i-1] && visited[i-1] == false )){
continue;
}
visited[i] = true;
per.append(schar[i]);
dfs(res,per,schar,visited,index+1);
per.deleteCharAt(per.length()-1);
visited[i] = false;
}
}
}
时间复杂度:O(n×n!);
空间复杂度:O(n)。