package com.zhang.reflection.面试.算法模版.回溯模版.模版;
import java.util.HashSet;
import java.util.Set;
/**
* 剑指 Offer 38. 字符串的排列
*
* 输入一个字符串,打印出该字符串中字符的所有排列。
*
*
*
* 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
*
*
*
* 示例:
*
* 输入:s = "abc"
* 输出:["abc","acb","bac","bca","cab","cba"]
*
*
*
* 限制:
*
* 1 <= s 的长度 <= 8
* 模版
* private void backtrack("原始参数") {
* //终止条件(递归必须要有终止条件)
* if ("终止条件") {
* //一些逻辑操作(可有可无,视情况而定)
* return;
* }
*
* for (int i = "for循环开始的参数"; i < "for循环结束的参数"; i++) {
* //一些逻辑操作(可有可无,视情况而定)
*
* //做出选择
*
* //递归
* backtrack("新的参数");
* //一些逻辑操作(可有可无,视情况而定)
*
* //撤销选择
* }
* }
*/
public class 模版 {
public String[] permutation(String s) {
Set<String> res = new HashSet<>();
back(s.toCharArray(),"",new boolean[s.length()],res);
//toArray转为object类型的数组,要想转为指定类型的数组,需要我们new String[0] 注意里面的字符最大是0-res.size(),再多会补null;
return res.toArray(new String[res.size()]);
}
private void back(char[] chars,String tmp,boolean[] visited,Set<String> res){
//首先是终止条件
if(chars.length == tmp.length()){
//一些所需要的操作
res.add(tmp);
return;
}
for(int i=0;i<chars.length;i++){
//排除一些选项或者跳过某些东西
if(visited[i]) continue;
//做出选择
visited[i] =true;
//回溯
back(chars,tmp+chars[i],visited,res);
//撤销选择
visited[i] = false;
}
}
}