- 組合總和
本題是 集合裡元素可以用無數次,那麼和組合問題的差別 其實僅在於 startIndex上的控制
題目連結/文章講解:https://programmercarl.com/0039.組合總和.html
影片講解:https://www.bilibili.com/video/BV1KT4y1M7HJ
/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function(candidates, target) {
candidates.sort((a,b)=>a-b);
const res = [];
const path = [];
let sum = 0;
let len = candidates.length;
const backtracking = (startIndex) => {
if (sum === target) {
res.push([...path]);
return;
}
for (let i=startIndex;i<len;i++) {
sum += candidates[i];
path.push(candidates[i]);
if (sum > target) {
sum -= candidates[i];
path.pop();
return;
}
backtracking(i);
sum -= candidates[i];
path.pop();
}
}
backtracking(0);
return res;
};
40.組合總和II
本題開始涉及到一個問題了:去重。
注意題目中給我們 集合是有重複元素的,那麼求出來的 組合有可能重複,但題目要求不能有重複組合。
題目連結/文章講解:https://programmercarl.com/0040.組合總和II.html
影片講解:https://www.bilibili.com/video/BV12V4y1V73A
/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum2 = function(candidates, target) {
candidates.sort((a,b)=>a-b);
let len = candidates.length;
const res = [];
const set = new Set();
const path = [];
const backtracking = (startIndex, sum) =>{
if (sum === target) {
res.push([...path]);
return;
}
for (let i=startIndex; i< len;i++) {
if (i>startIndex && candidates[i] === candidates[i-1]) {
continue;
}
let item = candidates[i];
sum += item;
if (sum > target) {
sum -= item;
return;
}
path.push(item);
backtracking(i+1,sum);
path.pop();
sum -= item;
}
}
backtracking(0,0);
return res;
};
131.分割回文串
本題較難,大家先看影片來理解 分割問題,明天還會有一道分割問題,先打打基礎。
https://programmercarl.com/0131.分割回文串.html
影片講解:https://www.bilibili.com/video/BV1c54y1e7k6
function isPalindrome(s, start, end) {
for (let i=start,j=end;i<=end;i++) {
if (s[i]!==s[j]) {
return false;
}
j--;
}
return true;
}
/**
* @param {string} s
* @return {string[][]}
*/
var partition = function(s) {
let res = [];
let path = [];
const backtraversing = (str,startIndex)=>{
if (str.length<=startIndex){
res.push([...path]);
return;
}
for (let i=startIndex;i<str.length;i++) {
if (isPalindrome(str,startIndex,i)) {
path.push(str.slice(startIndex,i+1));
backtraversing(str,i+1);
path.pop();
} else {
continue;
}
}
}
backtraversing(s,0);
return res;
};