首先,什么是backTracking?
这是backtracking和brute force的区别:
Backtracking can be seen as an optimized way to brute force. Brute force approaches evaluate every possibility. In backtracking you stop evaluating a possibility as soon it breaks some constraint provided in the problem, take a step back and keep trying other possible cases, see if those lead to a valid solution.
翻译过来就是:backtracking可以被看作是一个优化的蛮力。蛮力方法的做法是暴力遍历每一种的可能性。但是backtracking中如果遇到不满足约束条件的时候,就停止这一次的遍历,然后退一步,继续尝试其他可能的情况下的解。
哪些问题适合采用backtracking方法求解?
- 显式的要求返回所有答案的集合(Permutations or subsets)。
- 你关心的是实际的解的集合,而不是求解最优值(例如最大值,最小值等)。(如果是后者最有可能适合采用DP方法)。
下面是一个backtracking求解的通用模板:
实际上backtracking就是DFS方法,上图的undo choices 可以理解为往上跳一级。
下面我们来求解46和47,Permutations