回溯算法其实是纯暴力搜索。for循环嵌套是写不出的
组合:没有顺序
排列:有顺序
回溯法可以抽象为树形结构。只有在回溯算法中递归才会有返回值。
排列是有顺序的。
组合类问题用startindex,排序类问题用used,来标记使用过哪些元素。
空在根节点里面。
子集也是一种组合问题,因为它的集合是无序的。树形结构的每个节点的结果都是我们的结果。
全局变量数组path为子集收集元素,二维数组result存放子集组合。(也可以放到递归函数参数里)
为了检查序列是否有效,我们遍历这个序列,并使用一个变量 balance表示左括号的数量减去右括号的数量。如果在遍历过程中 balance的值小于零,或者结束时 balance 的值不为零,那么该序列就是无效的,否则它是有效的。
切割问题的回溯搜索的过程和组合问题的回溯搜索的过程是差不多的。
(困难)