93.复原IP地址
vector<string> result;
void backtracking(s,startindex,pointsum):
if pointsum==3{
if(isvalid(s,startindex,s.size()-1)):
result.push.back(s);
return;
for(i=startindex;i<s.size();i++){
if(isvalid(s,startindex,i)):
s.insert(s.begin()+i+1,".");
poinstsum+=1;
backtracking(s,i+2,pointsum)
s.erase(s.begin()+i+1);
pointsum-=1;}
}
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
result=[]
def isvalid(string):
if len(string)==0:
return False
if len(string)>1 and string[0]=='0':
return False
if not 0<=int(string)<=255:
return False
return True
def backtracking(s,startindex,pointsum):
if(pointsum==3):
if(isvalid(s[startindex:])):
result.append(s)
return
#单层回溯的逻辑
for i in range(startindex,len(s)):
if(isvalid(s[startindex:i+1])):
s=s[0:i+1]+'.'+s[i+1:]
pointsum+=1
else:
continue
backtracking(s,i+2,pointsum)
s=s[:i+1]+s[i+2:]
pointsum-=1
backtracking(s,0,0)
return result
78.子集
#伪代码
不是在终止条件去收集结果;是在叶子节点去收集结果
path 一维
result 二维
void backtracking(nums,startindex){
result.push_back(path);
if(startindex>=nums.size()):
return;
for(int i=startindex;;i<nums.size();i++){
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop.back();}
}
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
path=[]
result=[]
def backtracking(nums,startindex):
#这里不能是result.append(path) https://blog.csdn.net/m0_64583181/article/details/128263540
result.append(path[:])
if(startindex>=len(nums)):
return
for i in range(startindex,len(nums)):
path.append(nums[i])
backtracking(nums,i+1)
path.pop()
backtracking(nums,0)
return result
90.子集II
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
path=[]
result=[]
def backtracking(nums,startindex):
if path[:] not in result:
result.append(path[:])
if(startindex>=len(nums)):
return
for i in range(startindex,len(nums)):
path.append(nums[i])
backtracking(nums,i+1)
path.pop()
backtracking(nums,0)
return result
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
path=[]
result=[]
used=[0]*len(nums)
def backtracking(nums,startindex):
# if path[:] not in result:
# result.append(path[:])
# if(startindex>=len(nums)):
# result.append(path[:])
# return
result.append(path[:])
for i in range(startindex,len(nums)):
if(i>startindex and nums[i]==nums[i-1] and used[i-1]==0):
continue
path.append(nums[i])
used[i]=1
backtracking(nums,i+1)
path.pop()
used[i]=0
backtracking(nums,0)
return result