剑指 Offer 38. 字符串的排列-全排列-回溯
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 38. 字符串的排列-全排列-回溯相关的知识,希望对你有一定的参考价值。
一、题目描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例 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)。
以上是关于剑指 Offer 38. 字符串的排列-全排列-回溯的主要内容,如果未能解决你的问题,请参考以下文章
[Mdfs] lc剑指 Offer 38. 字符串的排列(全排列+枚举顺序+组合类型枚举+知识理解+模板题)