代码随想录算法训练营第二十八天| 93.复原IP地址 ● 78.子集 ● 90.子集II

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值