代码随想录回溯算法part01| 93. 复原IP地址、40.组合总和II、131.分割回文串
93. 复原IP地址
思路
:
需要注意:
- 第一个不能为0
- 最多有4个小部分,不能有类似这样 1.9.2.1.6.8.1.1(192.168.1.1)
不仅要进行切割,还要进行合法性判读
伪代码(C++)
:
void backtracking(candidate,target,sum,startIndex){ //startindex下一循环的初始位置
if(sum > target){
return
}
if(sum==target){
result.push_back(path);
return;
}
for (int i = startIndex; i < candidates.size(); i++) { // 单层搜索逻辑
sum += candidates[i];
path.push_back(candidates[i]);
backtracking(candidates, target, sum, i); // 关键点:不用i+1了,表示可以重复读取当前的数
sum -= candidates[i]; // 回溯
path.pop_back(); // 回溯
}
}
python代码
:
class Solution:
def backtracking(self, candidates, target, sum, startIndex):
if sum>target:
return
if sum == target:
self.result.append(self.path[:])
return
for i in range(startIndex, len(candidates)):
self.path.append(candidates[i])
sum += candidates[i]
self.backtracking(candidates, target, sum, i)
sum -= candidates[i]
self.path.pop()
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.result = []
self.path = []
self.backtracking(candidates, target, 0, 0)
return self.result
78.子集
python代码
:
class Solution:
def backtracking(self, nums, start_index, path, result):
result.append(path[:])
if start_index >= len(nums):
return
for i in range(start_index, len(nums)):
path.append(nums[i])
self.backtracking(nums, i+1, path, result)
path.pop()
def subsets(self, nums: List[int]) -> List[List[int]]:
result = []
self.backtracking(nums, 0, [], result)
return result
90.子集2
思路
:
需要注意:
- 第一个不能为0
- 最多有4个小部分,不能有类似这样 1.9.2.1.6.8.1.1(192.168.1.1)
不仅要进行切割,还要进行合法性判读
class Solution:
def backtracking(self, nums, start_index, path, result):
result.append(path[:])
if start_index >= len(nums):
return
for i in range(start_index, len(nums)):
if i>start_index and (nums[i] == nums[i-1]):
continue
path.append(nums[i])
self.backtracking(nums, i+1, path, result)
path.pop()
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
result = []
self.backtracking(nums, 0, [], result)
return result