leetcode 93 复原IP地址

通过递归,当满足了4层递归树,以及遍历元素到达字符串尾部(意味着用完了字符串中的数据)则可以把结果装入最终数组中,通过".".join(),如果没有满足层数,但是到达了数组尾部,那么也应该返回
然后如果当前字符为“0”那就特殊处理下
在递归的过程中,可以把数*10加和获得一个数字,然后判断是否在0与255之间(包括255),然后继续递归,不满足则break剪枝。

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        def dfs(j,t,result,allresult):           

            if t==4:
                if j == len(s):
                    print(result[:])
                    allresult.append(".".join(result[:]))
                return
            if j == len(s):
                print(result)
                return  

            if s[j]=="0":

                dfs(j+1,t+1,result+["0"],allresult)


            addr=0
            for i in range(j,len(s)):

                addr=addr*10+(ord(s[i])-ord("0"))

                if 0<addr<=0xFF:

                    dfs(i+1,t+1,result+[str(addr)],allresult)
                else:
                    break


        if len(s)==0:
            return []
        allresult=[]
        result=[]
        dfs(0,0,result,allresult)
        return allresult

自己的方法 不用循环,或循环变量设置为range(0,3),这里的判断剩下的元素是否过多或者不够用剪枝条件需要想清楚一点。

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:

        def check(s):
            s=int(s)

            if s<=255 and s>0:
                return True


        def dfs(j,t,result,allresult):

            if t==4:
                if j==len(s):
                    allresult.append(".".join(result))
                return 
            if j==len(s):
                return 
            if s[j]=='0':

                dfs(j+1,t+1,result+[s[j]],allresult)

            if len(s)-j>(4-t)*3 or len(s)-j<(4-t):
                return 

            else:
                if ord(s[j])-ord('0') not in [1,2,3,4,5,6,7,8,9]:return 

                if j<len(s) and check(s[j]):
                    #print(s[j])
                    dfs(j+1,t+1,result+[s[j]],allresult)
                if j+2<=len(s) and check(s[j:j+2]):
                    print(s[j:j+2])
                    dfs(j+2,t+1,result+[s[j:j+2]],allresult)
                if j+3<=len(s) and check(s[j:j+3]):
                    print(s[j:j+3])
                    dfs(j+3,t+1,result+[s[j:j+3]],allresult)


        if len(s)==0:
            return []
        allresult=[]
        result=[]
        dfs(0,0,result,allresult)
        return allresult
全部评论

相关推荐

vegetable_more_exercise:1-1.5万,没错啊,最少是1人民币,在区间内
点赞 评论 收藏
分享
11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务