代码随想录算法训练营第24天|回溯算法Part03

记录题目:

  • 复原 IP 地址
  • 子集 II
  • 递增子序列
  • 全排列
  • 全排列 II

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效 IP 地址由四个整数(每个整数位于 0255 之间,且不含前导 0)组成,整数之间用 . 分隔。

1
2
3
4
5
6
7
8
for(let j = i; j < s.length; j++) {
const str = s.slice(i, 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()
}

给定一个可能包含重复元素的整数数组 nums
返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集。

1
2
3
4
5
6
for (let i = startIndex; i < len; i++) {
if (i > startIndex && nums[i] === nums[i - 1]) continue;
path.push(nums[i]);
backtracking(i + 1);
path.pop();
}

给定一个整型数组,找到所有该数组的递增子序列,
递增子序列的长度至少是 2。
数组中的整数范围是 [-100,100],可能包含重复数字。

1
2
3
4
5
6
7
8
9
10
let uset = []
for(let i = startIndex; i < nums.length; i++) {
if((path.length > 0 && nums[i] < path[path.length - 1]) || uset[nums[i] + 100]) {
continue
}
uset[nums[i] + 100] = true
path.push(nums[i])
backtracing(i + 1)
path.pop()
}

给定一个不含重复数字的序列,返回其所有可能的全排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var permute = function (nums) {
const res = [], path = [], len = nums.length, used = [];
const backtracking = () => {
if (path.length === len) res.push(path.slice(0));
for (let i = 0; i < len; i++) {
if (used[i]) continue;
path.push(nums[i]);
used[i] = 1;
backtracking();
path.pop();
used[i] = 0;
}
}
backtracking();
return res;
};

给定一个可包含重复数字的序列,返回其所有不重复的全排列。

1
2
3
4
5
6
7
8
9
10
for (let i = 0; i < nums.length; i++) {
if ((i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) || used[i]) {
continue;
}
used[i] = true;
path.push(nums[i]);
backtracing(used);
path.pop();
used[i] = false;
}
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×