39. 组合总和
var combinationSum = function(candidates, target) {
let res = []
let path = []
let fn = (target,index,sum) => {
if(sum > target) return
if(sum === target){
res.push([...path])
return
}
for(let i=index;i<candidates.length;i++){
path.push(candidates[i])
sum += candidates[i]
fn(target,i,sum)
path.pop()
sum -= candidates[i]
}
}
fn(target,0,0)
return res
};
剪枝操作
for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++)
40. 组合总和 II
var combinationSum2 = function(candidates, target) {
const res = []; path = [], len = candidates.length;
candidates.sort((a,b)=>a-b);
backtracking(0, 0);
return res;
function backtracking(sum, i) {
if (sum === target) {
res.push(Array.from(path));
return;
}
for(let j = i; j < len; j++) {
const n = candidates[j];
if(j > i && candidates[j] === candidates[j-1]){
//若当前元素和前一个元素相等
//则本次循环结束,防止出现重复组合
continue;
}
//如果当前元素值大于目标值-总和的值
//由于数组已排序,那么该元素之后的元素必定不满足条件
//直接终止当前层的递归
if(n > target - sum) break;
path.push(n);
sum += n;
backtracking(sum, j + 1);
path.pop();
sum -= n;
}
}
};
131. 分割回文串
var isHunWen = (s,l,r) => {
for (let i = l, j = r; i < j; i++, j--) {
if(s[i] !== s[j]) return false;
}
return true;
}
var partition = function(s) {
let result = []
let path = []
let fn = (index,s) => {
if(index >= s.length){
result.push([...path])
return
}
for(let i=index;i<s.length;i++){
if(isHunWen(s,index,i)){
path.push(s.slice(index,i+1))
}else{
continue
}
fn(i+1,s)
path.pop()
}
}
fn(0,s)
return result
};