0
点赞
收藏
分享

微信扫一扫

使用stack栈集合完成ABC全排列

zhyuzh3d 2022-03-30 阅读 21
java

新手入门dfs/回溯


前言

本题选用ABC全排列问题,方便大家更容易理解dfs回溯过程
记录个人对算法的总结的理解,如有错误请大佬指出,


提示:以下是本篇文章正文内容,下面案例可供参考

一、dfs,回溯模板?

个人看过诸多关于dfs,回溯视频以及其他优质博客
都主要围绕两点,1:何时停止搜索,2:遍历剩下节点,

二、使用步骤

废话不多说上代码,可以仔细理解文章注释,建议先画出它的树状结构图,便以理解代码

2.读入数据

代码如下(示例):

import java.util.*;

public class ABC {
    public static void main(String[] args) {
        //res1负责存储最终结果
        List<Stack<Character>>res1=new ArrayList<>();
        //使用栈集合,先进后出原则
        Stack<Character> res = new Stack<>();
        char[]a={'A','B','C'};
        System.out.println(permute(a));
    }
    public static List<List<Character>> permute(char[]nums){
        List<List<Character>>res1=new ArrayList<>();
        Stack<Character> res = new Stack<>();
        int len= nums.length;
        boolean[]pb=new boolean[len];    ///判断次数
        dfs(nums, pb, 0, res,res1);   //进行dfs
        return res1;
    }
    //pb判断当前元素是否使用
    public static void dfs(char[]nums, boolean[]pb, int index, Stack<Character> res, List<List<Character>> res1){
        //截至条件
        if(index==nums.length){
            res1.add(new ArrayList<>(res));    //只要层级达到字符数字长度就将路径添加到res1中
            return;                         //return单个使用,为终止方法
        }
        //遍历候选节点
        for (int i = 0; i < nums.length; i++) {
            char c = nums[i];
            if (!pb[i]) {          //判断当前元素是否使用的条件,boolean默认为false
                res.push(c);        //把没有使用的元素添加到栈集合里面
                pb[i] = true;       //因为使用了这个元素所以给他设置为true,
                dfs(nums, pb, index + 1, res,res1);  //此处+1是为了进入下一层,如果想深入理解的伙伴可以在回溯前后打印当前元素值
                res.pop();              //恢复状态,将前一个元素删除,
                pb[i] = false;             //删除了就证明没有被使用了
            }
        }
    }

}

---

# 本人创建新手交流群,群内基本小白,可以使大家没有压力问问题,并配备一位大佬,群内拥有丰富学习路线资源,大家可以共同进步,欢迎前来交流983528891

举报

相关推荐

0 条评论