Restore IP Addresses

leetcode第93题,计算有效的IP地址。

分析问题,首先什么是有效的IP,这里有效是广义的,也就是凡是符合IP的要求的都算,不考虑特殊IP地址的限制。这样有效IP的要求就放宽了不少,首先IP应该有四级,每一个的数字都应该在0-255之间,还有一点比较隐蔽,那就是0单独出现时正确的,但是如“”010”这样的数字就是不合法的了。

确认有效IP的格式后,就要分析算法,这里运用深度搜索,递归出口条件有两个,一个是长度上不符合要求则要立刻返回,而是当递归到最后一层时需要判断首位是否为0且在0-255范围内。

递归的时候,遍历方式为从当前第一个字符开始依次向后扩展1-3个字符。

class Solution(object):
    def restoreIpAddresses(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        def dfs(string,n):
            if len(string) > 3*n or len(string) < n: # 如果长度不符合要求则直接返回
                return []
            if n == 1: # 考虑处理到最后的字符串的情况
                if string[0] == '0' and len(string) > 1: # 开头是0,但不是单个的0返回
                    return []
                if int(string) > 255: # 最后的子串超出范围返回
                    return []
                return [string]
    
            ret = []
            for i in xrange(1,4):
                if string[0] == '0' and i > 1: # 开头是0,不是单个的0
                    continue
                if int(string[:i]) > 255: # 超出返回
                    continue
                iret = dfs(string[i:],n-1) # 深搜
                if len(iret) > 0:
                    ret += [string[:i]+'.'+iiret for iiret in iret]
            return ret
    
        return dfs(s,4)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值