剑指 Offer 38. 字符串的排列
难度中等109收藏分享切换为英文接收动态反馈
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
深度优先搜索,可以在每一位上维护一个set集合防止该位出现相同的字符导致重复,达到剪枝的目的。
package LeetCode;
import java.util.*;
/**
* @ClassName Offer38
* @Description TODO
* @Author m
* @Version 1.0
*/
public class Offer38 {
List<String> res = new ArrayList<>();
char[] c;
public String[] permutation(String s) {
c = s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
/**
* 搜索确定第x位上的字符
* @param x
*/
private void dfs(int x) {
//遍历到头,将当前的字符数组转化为字符串加入结果
if (x == c.length-1) {
res.add(String.valueOf(c));
return;
}
//对每一个位置出现过的字符记录,防止同一位置出现相同的字符,达到剪枝的目的
Set<Character> set = new HashSet<>();
for (int i = x; i < c.length; i++) {
if(set.contains(c[i])) {
continue;
}
set.add(c[i]);
swap(i , x);
//遍历下一个字符
dfs(x+1);
swap(i, x);
}
}
/**
* 交换字符数组的字符
* @param i
* @param j
*/
private void swap(int i, int j) {
char tmp = c[i];
c[i] = c[j];
c[j] = tmp;
}
public static void main(String[] args) {
for (String s : new Offer38().permutation("abc")) {
System.out.println(s);
}
System.out.println();
}
}