算法之回溯模版1无返回值

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;
        }

    }
}

全部评论

相关推荐

陆续:不可思议 竟然没那就话 那就我来吧 :你是我在牛客见到的最美的女孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务