题目描述:
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
代码:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* @author :Puppet
* @description:剑指 Offer 38
* @date :2021/11/11 16:51
*/
public class StringSort {
/**
* DFS
* 该题目一看就是裸的dfs
* 我们不断地去将元素的位置进行交换
*/
char[] ch;
List<String> list = new ArrayList<>();
public String[] permutation(String s) {
ch = s.toCharArray();
dfs(0);
return list.toArray(new String[list.size()]);
}
public void dfs(int index){
//结束条件:如果所有元素都在该排列中就加入list中,即到叶子结点
if (index == ch.length - 1){
list.add(new String(ch));
return;
}
HashSet<Character> set = new HashSet<>();
for (int i = 0; i < ch.length; i++){
//元素不能重复,利用此点进行剪枝
if (set.contains(ch[i])) continue;
//使用过就将其加到set中,其实这里也可以使用一个visted[]数组进行标记
set.add(ch[i]);
swap(i,index);
//继续往下搜索
dfs(index + 1);
swap(i,index);
}
}
private void swap(int i, int j){
char tmp = ch[i];
ch[i] = ch[j];
ch[j] = tmp;
}
public static void main(String[] args) {
StringSort stringSort = new StringSort();
String[] strings = stringSort.permutation("abc");
for (String str : strings){
System.out.println(str);
}
}
}