一、组合问题
题目要求的结果是当前排列的分割!对于长度为n的数组,我们需要依次确认每个位置上的元素。初始问题:从a[0]开始依次确认n个元素。如果我们确认a[0]之后,问题就变成从a[1]开始从剩余元素中选择一个元素确定a[1]。每次选择都有多种可能性,我们依次尝试(尝试后还原),并递归解决选择之后的产生的子问题,并定义出口。
例如给出初始集合[1, 2, 3],则结果应该是[1, 2, 3], [1, 3], [2, 3], [3]
题目例如Lintcode 426. 恢复IP地址、Lintcode 136. 分割回文串、Lintcode 425. 电话号码的字母组合、Lintcode 152. 组合、Lintcode 135. 数字组合、Lintcode 153. 数字组合 II、Lintcode 17. 子集、Lintcode 18. 子集 II、Leetcode 22.括号生成
二、全排列问题
题目要求的结果是所有排列的集合!用一个标记数组标记元素是否已经使用过,每次从剩余元素中尝试添加新元素到临时解中,当没有新的元素可添加时,临时解就为最终的一个解。
例如给出初始集合[1, 2, 3],则结果应该是[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
题目例如Lintcode 15. 全排列、Lintcode 16. 带重复元素的排列
三、二维问题
例如Lintcode 1080. 最大的岛、Lintcode 1479. 能否到达终点、Lintcode 1386. 坐缆车、Lintcode 123. 单词搜索、Lintcode 433:岛屿的个数

本文总结了DFS在解题中的应用,包括处理组合问题、全排列问题和二维问题。在组合问题中,通过递归尝试不同选择并还原以找到所有可能的分割。全排列问题利用标记数组记录元素使用情况,生成所有可能的排列。而在二维问题中,如岛屿计数等,DFS用于探索二维空间的路径。文中给出了相关例题和解题思路。
1192

被折叠的 条评论
为什么被折叠?



