39.组合总和
40.组合总和II
131.分割回文串
39. 组合总和
var combinationSum = function(candidates, target) {
const res = [];
const backtrack = (arr, sum, start) => {
if (sum === target) {
res.push([...arr]);
return;
}
for (let i=start; i<candidates.length; i++) {
sum += candidates[i];
if (sum > target) {
sum -= candidates[i];
continue;
}
arr.push(candidates[i]);
backtrack(arr, sum, i);
sum -= candidates[i];
arr.pop();
}
}
backtrack([], 0, 0);
return res;
};
var combinationSum = function(candidates, target) {
const res = [];
candidates.sort((a,b) => a-b);
const backtrack = (arr, sum, start) => {
if (sum === target) {
res.push([...arr]);
return;
}
for (let i=start; i<candidates.length && sum + candidates[i] <= target; i++) {
sum += candidates[i];
arr.push(candidates[i]);
backtrack(arr, sum, i);
sum -= candidates[i];
arr.pop();
}
}
backtrack([], 0, 0);
return res;
};
40.组合总和II
var combinationSum2 = function(candidates, target) {
candidates.sort((a,b) => a-b);
const res = [];
const used = new Array(candidates.length).fill(false);
const backtrack = (arr, sum, start) => {
if (sum === target) {
res.push([...arr]);
return;
}
for (let i=start; i<candidates.length && sum + candidates[i] <= target; i++) {
if (i>0 && candidates[i] === candidates[i-1] && used[i-1] === false ) {
continue;
}
sum += candidates[i];
arr.push(candidates[i]);
used[i] = true;
backtrack(arr, sum, i+1);
used[i] = false;
sum -= candidates[i];
arr.pop();
}
}
backtrack([], 0, 0);
return res;
};
131.分割回文串
var partition = function(s) {
const res = [];
const isValid = (start, end) => {
if (start === end) return true;
let i=start, j=end;
while (i<j) {
if (s[i] !== s[j]) {
return false;
}
i++;
j--;
}
return true;
}
const backtrack = (arr, start) => {
if (start >= s.length) {
res.push([...arr]);
}
for (let i=start; i<s.length; i++) {
if (isValid(start, i)) {
arr.push(s.substring(start, i+1));
} else {
continue;
}
backtrack(arr, i + 1);
arr.pop();
}
}
backtrack([], 0);
return res;
};