首页 > 其他分享 >day28| 93+78+90

day28| 93+78+90

时间:2023-04-13 19:22:18浏览次数:60  
标签:return day28 nums res dfs 子集 path 90 93

93.复原ip地址

 

题目简述:

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

 

思路:

1. 取出前几个字符,检测合法性

2. 如果合法,把这些个字符当作第一段,问题变成了把剩余字符串分为剩余段数

3. 不合法,直接return

4. 到了分最后一段的时候,直接检测剩余的字符串的合法性,合法了,那就多了一种组合

 

代码如下:

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        # 1. 依次检查字符是否合法,是不是数字,在不在特定范围
        # 2. 检查分割次数;到了最后一次分割次数,直接把检测剩余字符串的合法性
        res=[]
        path=[]
        n=len(s)
        def is_legal(arr):
            if arr.isdigit():
                if int(arr)>=0 and int(arr)<=255:
                    if len(arr)>1 and arr[0]=='0':# 这里别写成了arr[0]==0,字符肯定不等于0
                        return False
                    else:
                        return True
                else:
                    return False
            return False
        


        
        def dfs(begin,path,depth):
            if depth==3:
                if is_legal(s[begin:]):
                    path.append(s[begin:])
                    res.append(''.join(i for i in path))
                    path.pop()# 要注意恢复原样
                    return 
                return

            for i in range(begin+1,n):
                if is_legal(s[begin:i]):
                    path.append(s[begin:i])
                    path.append(".")
                    dfs(i,path,depth+1)
                    path.pop()
                    path.pop()
                else:
                    return
            return
        
        dfs(0,[],0)
        return res

 

78.子集

 

题目简述:

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

 

思路:

1. 分为元素在自己中,不在自己中,两种情况

 

代码:

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        # 1. 从左至右遍历,分为在子集中,不在子集中两种情况
        n=len(nums)
        res=[]

        def dfs(path,depth):
            if depth==n:
                res.append(path[:])
                return # 不要忘记return
            
            dfs(path,depth+1)
            path.append(nums[depth])
            dfs(path,depth+1)
            path.pop()
            return
        
        dfs([],0)
        return res

 

 

90. 子集II

 

题目简述:

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

 

思路:

我们从左向右往子集增加元素,到头了就回溯,把子集的最后一个元素删去,再从该最后元素对应的原数组位置的下一个位置开始遍历,考虑重复情况进行跳过

 

1. 考虑数组[1,2,3],选择前两个数,或者第一/三个数,都会得到相同的子集

2. 也就是说,对于当前选择的数x,若前面有与其相同的数y,且没有选择y,此时若把x放入自己中,会发现该情况我们已经考虑过了

3. 这是需要条件判断语句来跳过这种情况

 

代码:

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        def backtrack(begin,size,path,used):

            res.append(path[:])

            for i in range(begin,size):
                if used[i-1]==False and nums[i]==nums[i-1] and i>0:
                    continue
                used[i]=True
                backtrack(i+1,size,path+[nums[i]],used)
                used[i]=False
        
        size=len(nums)
        nums.sort()
        res,path=[],[]
        used=[False for _ in range(size)]
        backtrack(0,size,path,used)
        return res

 

 

总结:

1. 先写dfs函数,参数可以先不确定,可以一边写一些确定参数

2. 停止条件也可以先写好函数的正常情况,再来考虑特殊情况

3. 如果特殊情况比较多,可以进行细致地分类

4. 这些dfs函数并没有返回值,都是直接在函数终止条件里,把要做的事情都给做了

 

标签:return,day28,nums,res,dfs,子集,path,90,93
From: https://www.cnblogs.com/cp1999/p/17315893.html

相关文章

  • 934. 最短的桥
    题目描述矩阵中有两个岛屿问岛之间的最小距离?f1-bsf+bfs基本分析怎么求第一个岛的所有点?找到第一个1后bfs怎么保证不重复添加?入队的点设置为-1怎么求到第二个岛的最小距离?第一个岛的所有点入队,遍历一轮step+1,遇到1的时候返回step代码classSolution:defshorte......
  • P2490 [SDOI2011]黑白棋
    题意:一个1*n的棋盘上有k个棋子,一半是黑一半是白,并且是白黑白黑白黑...白黑的形式,A每次最多可以将d个白棋子向右移动,B每次最多可以将d个黑棋子向左移动,不能不移动棋子,谁最后无法移动棋子谁就输了,A先手,问有多少种布局可以使得A获胜SolutionNim-K博弈+动态规划可以把棋子之间的间......
  • PAT Basic 1093. 字符串A+B
    PATBasic1093.字符串A+B1.题目描述:给定两个字符串 \(A\) 和 \(B\),本题要求你输出 \(A+B\),即两个字符串的并集。要求先输出 \(A\),再输出 \(B\),但重复的字符必须被剔除。2.输入格式:输入在两行中分别给出 \(A\) 和 \(B\),均为长度不超过 \(10^6\)的、由可见ASCII......
  • 外媒传的IBM沃森健康裁员4900人尽是胡扯
    题记:转型中的财报好不好看,IBM都总是会躺枪。2015年4月,IBM花费巨资收购的健康管理软件公司Phytel。2015年4月,IBM花费巨资收购了医疗保健分析提供商Explorys。2015年8月,IBM花费10亿美元收购医学成像及临床系统供应商MergeHealthcare。2016年,IBM花费26亿美元收购了医疗与健康数据分析......
  • PAT Basic 1090. 危险品装箱
    PATBasic1090.危险品装箱1.题目描述:集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。2.输入格......
  • 福建游乐园运营商金生游乐申请纳斯达克IPO上市,募资900万美元
    猛兽财经获悉,来自福建南平的游乐园运营商金生游乐集团GoldenHeavenGroupHoldingsLtd,(以下简称金生游乐),近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为(GDHG),金生游乐计划通过此次纳斯达克IPO上市以每股4.50美元的价格出售200万股普通股,并募集资金900万......
  • INFO90002 A1
    INFO90002A12023s1 INFO900022023Semester1-ASSIGNMENT1Weighting:20%ofyourtotalassessmentGroupAssessment:Groupsoffour(4)studentsfromthesametutorialAssignmentdeadline:CheckCanvasAssignmentsubmission:CanvasCASESTUDY:ThePsiSocia......
  • C语言矩阵顺时针旋转90度和力扣34. 在排序数组中查找元素的第一个和最后一个位置
    #include<iostream>usingnamespacestd;#defineM5#include<stdlib.h>//原矩阵,某元素第n行第m列,;顺时针旋转90度后,位置变成倒数第n列,第m行//即先转置再水平翻转intn=0;voidrotation_90(intmatrix[][M],intn){ for(inti=0;i<n;i++) { for(intj=i;j<M;j++)......
  • php的TP框架保存数据报错: SQLSTATE[HY000]: General error: 1366 Incorrect string v
    这一般情况就是保存表情字符导致的字符长度问题原因可能: (需要改字符集为 utf8mb4 排序规则为utf8mb4_general_ci)1.数据表字段不是utf8mb42.项目目录下文件.env里配置mysql  CHARSET=utf8需要该为 CHARSET=utf8mb43.如果不存在.env文件,则可能是config目......
  • COMP9315 DBMS Implementation
     COMP931523T1Assignment2RelationalOperatorsandMemoryBufferManagementDBMSImplementationLastupdated:Saturday8thApril6:48pmMostrecentchangesareshowninred...olderchangesareshowninbrown.RecentUpdates[2023-04-0722:40]Aminorupdate......