python刷题之路:递归--426. 恢复IP地址

题目:

426. 恢复IP地址

中文English

给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。

(你的任务就是往这段字符串中添加三个点, 使它成为一个合法的IP地址. 返回所有可能的IP地址.)

样例

样例 1:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

网上最详细的解释,每一步代码都有注释,是在不行,可以把代码中注释掉的print都输出一下,一目了然。

最需要注意地方就是每次传入的s都不一样,比如。第一次是原来输入的s=“25525511135” ,然后,取了第0部分的数字时s[0] = 2,那么第二次递归就是把s[1:] = “5525511135”传进去,同时ip变成了ip+‘.’+'s[0]'就会说‘.2’,这样的话最后的ip是形如“.***.***.***.***”,因此最后res.append()的时候是从ip的第一个开始,也就是要去掉第一个‘.’。

class Solution:
    """
    @param s: the IP string
    @return: All possible valid IP addresses
    """
    def restoreIpAddresses(self, s):
        # write your code here
        #注意,每次dfs的时候传入的s都不一样
        def dfs(s,sub,res,ip):
            if sub == 4:
                if s == '':
                    res.append(ip[1:])
                return
            #在s的前面取第sub部分的数字,可以取:
            #s[:1]只有1位数字;s[:2]只有2位数字;s[:3]只有3位数字
            #因为ip是0-255,最多3位数字,所以i是从1到3
            for i in range(1,4):
                #假设此时s = '35',那么此时i就没必要循环到3了
                #因为本身这个s的长度都是2。
                if i <= len(s): 
                    #在第sub这部分取的数字的值要不大于255
                    if int(s[:i]) <= 255:
                        # print(sub,i,s[i:],ip+'.'+s[:i])
                        #取完了第sub部分,并且取好的ip是前面的ip+‘,’+s[:i](第sub部分取好的)
                        #那就递归的取第sub+1部分,此时传入的s不是原来的s,
                        #是取完第sub部分之后的s,也就是s[i:]
                        dfs(s[i:], sub+1, res, ip+'.'+s[:i])
                    #在取sub这部分数字时发现有‘0**’这种情况的,就停止,
                    #但是‘0’是可以的,此时sub部分数字就是‘0’,就好了。因此只可以循环一次
                    if s[0] == '0': 
                        # print("taken once")
                        break
        res = []
        dfs(s, 0, res, '')
        return res                

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值