dfs+回溯写题两种思路

2023-10-10 10:08
文章标签 两种 dfs 思路 回溯 写题

本文主要是介绍dfs+回溯写题两种思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

dfs+回溯写题两种思路

主要框架

	public void dfs(选择列表){//1.找到结束条件//2.遍历所有可能性//2.1做选择//2.2 递归调用自己进一步深度遍历//3.回撤选择
}
  • dfs函数的参数变量我觉得是越少越好,所以将一些不怎么改变的变量设置为全局变量更容易理清思路

1.遍历的过程不停的往中间变量添加数据

剑指 Offer 38. 字符串的排列

	static Set<String> res;static char[] ch;static boolean[] ch_helper;public static String[] permutation(String s) {res = new HashSet<>();ch = s.toCharArray();ch_helper = new boolean[ch.length];dfs("");return res.toArray(new String[res.size()]);}private static void dfs(String str) {//1.结束条件if(str.length() == ch.length){res.add(str);}//2.遍历所有可能性for(int i = 0; i < ch.length; i++){if(ch_helper[i] != true){ch_helper[i] = true;dfs(str + ch[i]);ch_helper[i] = false;}}}

46. 全排列

	static List<List<Integer>> res;static LinkedList<Integer> tmp;public static List<List<Integer>> permute(int[] nums) {res = new LinkedList<>();tmp = new LinkedList<>();dfs(nums);return res;}private static void dfs(int[] nums) {if(tmp.size() == nums.length){res.add(new ArrayList<>(tmp));return;}for(int num : nums){if(tmp.contains(num)){continue;}tmp.add(num);dfs(nums);tmp.removeLast();}

2. 遍历的过程改变原列表,这种一般会从下标0开始

剑指 Offer 38. 字符串的排列

static List<String> res;static char[] ch;public static String[] permutation(String s) {res = new LinkedList<>();ch = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}private static void dfs(int i) {//1.结束条件if (i == ch.length - 1){res.add(String.valueOf(ch));return;}//2.选择列表Set<Character> set = new HashSet<>();for(int idx = i; idx < ch.length; idx++){if(set.contains(ch[idx]))continue;set.add(ch[idx]);//2.1选择swap(ch, idx, i);//2.2 进一步dfs(i + 1);//3.回溯swap(ch, idx, i);}}private static void swap(char[] ch, int idx, int i) {char tmp = ch[idx];ch[idx] = ch[i];ch[i] = tmp;}

46. 全排列

  1. 么有剪枝
static List<String> res;static char[] ch;public static String[] permutation(String s) {res = new LinkedList<>();ch = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}private static void dfs(int i) {//1.结束条件if (i == ch.length - 1){res.add(String.valueOf(ch));return;}//2.选择列表for(int idx = i; idx < ch.length; idx++){set.add(ch[idx]);//2.1选择swap(ch, idx, i);//2.2 进一步dfs(i + 1);//3.回溯swap(ch, idx, i);}}private static void swap(char[] ch, int idx, int i) {char tmp = ch[idx];ch[idx] = ch[i];ch[i] = tmp;}
  1. 带剪枝
	static List<String> res;static char[] ch;public static String[] permutation(String s) {res = new LinkedList<>();ch = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}private static void dfs(int i) {//1.结束条件if (i == ch.length - 1){res.add(String.valueOf(ch));return;}//2.选择列表Set<Character> set = new HashSet<>();for(int idx = i; idx < ch.length; idx++){if(set.contains(ch[idx]))continue;set.add(ch[idx]);//2.1选择swap(ch, idx, i);//2.2 进一步dfs(i + 1);//3.回溯swap(ch, idx, i);}}private static void swap(char[] ch, int idx, int i) {char tmp = ch[idx];ch[idx] = ch[i];ch[i] = tmp;}

这篇关于dfs+回溯写题两种思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179758

相关文章

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.