题目
- Subsets I & II
- Combination Sum I & II & III
- Permutation I & II
- Palindrome Partitioning
- N-Queens
- Word Ladder
- Expression Expand
- String Permutation II
总结
- Traverse 给人的感觉是先解决问题前面的一部分, 再递归地去解决缩小了的问题
- 比如Palindrome partitioning, 当我们从头走向字符串末尾, 我们将问题变成了, 假若前面的子串划分确定好了, 并且是palindrome, 那么问题便会转化为 find all possible palindrome partitioning of s(i, s.length)
- divide & conquer 就是一直走, 走到问题的最后, 一小部分一小部分解决了, 然后合并小问题来解决大问题
- 其实
- 一个permutation
- 一个subset
- 一个combination sum to target
- 一个palindrome partitioning string
- 一个n-queen 方案
- 它们相当于一个solution, 而使用dfs, 当前的递归就相当于先解决前一小部分的问题
- 比如
- 确定其中一个permutation的第一个数
- 确定其中一个subset的第一个数
- 确定其中一个palindrome string 的第一个string
- 确定其中一个n-queen 方案的 第一行
- 那么n大小问题就会缩小为 n - 1 问题
- 解决当前这个permutation 的余下的位置的空缺
- 解决当前string余下的字母的partitioning
- 解决当前这个方案余下的行
- 一个非常非常容易错的点
- 尽量不用continue, 因为很容易让你的backtracking 出错
- 有一点容易错的是: stringbuilder 反转后要反回去,不然bactracking会出错
- dfs 适合找路径, bfs适合找点
- 另外, 通过一个点找到其余连通的点也能用dfs
- 记录形状可以用偏移量组成字符串
- 将两个具有某一相同特征的事物组合在一起, 可以根据图的连通块概念
- 组合类型的题目[1,2,3], 通常递归定义是以空集(index为0)开始的结果集, 以1开始的结果集






