39. 组合总和
可以重复的组合:
1.关键点:不用i+1了,表示可以重复读取当前的数
依然是需要startIndex的,否则就会是有序的排列
2.先排序,后剪枝:如果 sum + candidates[i] > target 就终止遍历
40.组合总和II (树枝去重与树层去重)
1.难点:集合(数组candidates)有重复元素,但还不能有重复的组合。
都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因。
那么问题来了,我们是要同一树层上使用过,还是同一树枝上使用过呢?
回看一下题目,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。
所以我们要去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,不用去重。
为什么要树层去重?
例:[1,1,4,6,7] target=8
第一个1往后取的[1,7]必然会包含后面的1组成的[1,7]
2.先排序,后去重
3.初始化used数组:vector used(candidates.size(), false);
131.分割回文串
1.在单层递归中判断是否是回文,而不是在终止条件中判断,为什么呢
2.substr的用法:
substr(string, start, length)