头条2019笔试题3:leetcode93 恢复ip

上报IP时,忽律了’.’,现在要还原所有原始IP的数量
输入是一个字符串,输出一行一个整数。
leetcode93
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

示例:

输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]

输入

8888

输出

1

思路:
每次dfs的时候都去检查一下所有的字符串的长度是不是能满足在最多4个3位数字组成。
用dfs的核心部分是要判断,结束dfs的边界,以及 dfs的结果 如何迭代存储,dfs下一个递归的输入。
该问题里:
每个合法的ip都有4个部分,从0到3来依次判断,只有四个部分都合法才是合法ip。
dfs(s,[],res)
这里s是剩余的字符串,path=[]用存合法ip的每个部分(迭代过程中长度<=4),res用来把所有合法的ip加到list里。
首先要考虑好所有结束dfs的情况,要直接return结束,也就是剩下字符串已经无法构成合法ip了。
还有就是字符串为空,path的长度为4,也就有4个合法部分,就把它加到res.
接着判断dfs下一次递归的条件。
要分析每一个ip的合法部分是怎么构成的,可以有0位到3位都可以。
这里要注意,如果剩下的字符串小于3位了,选择就只能用剩下字符串的长度来选。
所以遍历的时候 i要取2者的最小值 min(len(s),3)
那么第一部分的合法构成,就从0-i位算起。
这时候又要判断边界问题。如果当前ip部分第一位是0且长度还超过2 或者 大小超过255,说明这部分取值出来的是非法的ip部分,这个分支走不通,直接continue进入下一个分支。
然后就可以把合法的ip加到path里,然后下一次dfs里字符串会从i+1开始算。
代码:

class Solution(object):
    def restoreIpAddresses(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        res = []
        '''
        s是剩余的字符串,path是临时的List用来装每个ip的部分,
        res用来装所有合法的ip字符串
        '''
        self.dfs(s, [], res)
        return res

    def dfs(self, s, path, res):
        '''
        path里装着已经合法的Ip部分,每部分最大长度为3,如果剩余的字符串
        长度比剩下的ip部分的最大长度还要大,说明合法ip太短了,剩下的部分
        太长,没法再构成合法的ip
        '''
        if len(s) > (4 - len(path)) * 3:
            return
        '''
        如果剩余字符串s为空,且Ip部分的长度刚好为4,该ip就是正确的四个部分,
        把这个list加到res里
        '''
        if not s and len(path) == 4:
            res.append('.'.join(path))
            return
        '''
        如果剩余字符串长度比3还小,就按剩余字符长度来遍历。
        否则就按3来遍历。
        当前部分是剩余字符串里 0到i(包括i)的字符串
        如果当前ip部分第一位是0且长度还超过2  或者 大小超过255,说明
        是非法的ip,这个分支走不通,直接continue进入下一个分支。
        否则,这个分支是合法的,那就要把正确的Ip的部分加入到path里,
        i前面的已经判断完了,下一波字符串从i+1开始判断。path和res都要传入,方便更新。        
        '''
        for i in range(min(3, len(s))):
            curr = s[:i+1]
            if (curr[0] == '0' and len(curr) >= 2) or int(curr) > 255:
                continue
            self.dfs(s[i+1:], path + [s[:i+1]], res)
ipstr=input()
print(Solution().restoreIpAddresses(ipstr))

参考:
https://blog.csdn.net/fuxuemingzhu/article/details/80657420

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值