93.复原IP地址
思路:
注意切割需要找到切割线 位置,递归终止条件判断可以靠句号的数量 等于三个即递归结束
代码实现
var restoreIpAddresses = function (s) {
const res = [], path = [];
const backTracking = (startIndex) => {
//终止条件
const len = path.length;
if (len > 4) return
if (len === 4 && startIndex === s.length) {
res.push(path.join("."));
return
}
for (let j = startIndex; j < s.length; j++) {
const str = s.slice(startIndex, j + 1)
if (str.length > 3 || +str > 255) break;
if (str.length > 1 && str[0] === "0") break;
path.push(str);
backTracking(j + 1);
path.pop()
}
}
backTracking(0)
return res
};
78.子集
思路: 这道题较为简单 为回溯法的模板题 跟切割组合问题不同 ,这道题需要收集树上的每个节点的值
代码实现:
var subsets = function (nums) {
let result = [], path = [];
const backTracking = (startIndex) => {
result.push([...path]);
for (let i = startIndex; i < nums.length; i++) {
path.push(nums[i]);
backTracking(i + 1);
path.pop()
}
return
}
backTracking(0)
return result
};
90.子集II
思路: 这道题相对于子集I来说,多了一点数组内元素可以重复,但数组本身不可重复,可以使用used数组来记录使用过的元素,前提是一定要先把nums进行排序
代码实现:
var subsetsWithDup = function (nums) {
let result = [], path = [];
let len = nums.length
let used = new Array(len).fill(false)
nums = nums.sort((a, b) => a - b)
const backTracking = (startIndex, used) => {
result.push([...path]);
for (let i = startIndex; i < nums.length; i++) {
if (i > 0 && nums[i - 1] === nums[i] && used[i - 1] === false) {
continue
}
used[i] = true
path.push(nums[i]);
backTracking(i + 1, used)
used[i] = false
path.pop()
}
}
backTracking(0, used)
return result
};
总结:
今天总体较为容易,结合之前学的,会感觉比较轻松