LeetCode 剑指 Offer 38. 字符串的排列
题目描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
1 <= s 的长度 <= 8
一、解题关键词
二、解题报告
1.思路分析
深度优先 不解释
注意全排列和非全排列 的组合下标位置的确定
2.时间复杂度
3.代码示例
class Solution {
List<String> strList = new LinkedList<>();
char[] ch;
public String[] permutation(String s) {
ch = s.toCharArray();
dfs(0);
return strList.toArray(new String[strList.size()]);
}
void dfs(int index){
int len = ch.length;
if(index == len - 1){
strList.add(String.valueOf(ch));
return;
}
HashSet<Character> set = new HashSet<>();
for(int i = index;i< len;i++){
if(set.contains(ch[i])){continue;}//剪枝
set.add(ch[i]);
swap(i,index);
dfs(index + 1);
swap(i,index);
}
}
void swap(int a,int b){
char tmp = ch[a];
ch[a] = ch[b];
ch[b] = tmp;
}
}
2.知识点