LeetCode93-复原IP地址

这两天刚看了一部电影

片名叫神探

这部电影讲述的是:

一位患有人格分裂能看清人内心的鬼的天才警察

受另一位警察所托去调查一件神秘案件的故事

电影的结局是我觉得最出人意料的地方

我这儿就不剧透了

真的是看得我震惊

另外补充一点:

刘青云真的是演技炸裂,炸到爆!!!

一个人撑起了一部戏!


93-复原IP地址

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

示例:

["255.255.11.135", "255.255.111.35"]

思路:

这道题目描述的很简单,用到的方法也是我们比较熟悉的回溯法。看了网上大佬的分享,好似这道题与前面的第17题电话号码的字母组合比较类似,大家也可以看看我前面写的这篇文章。

https://blog.csdn.net/weixin_36431280/article/details/84200845

关于回溯法,我前面也写了一篇关于回溯法的文章,还是比较通俗易懂的,大家也可以看看。

https://blog.csdn.net/weixin_36431280/article/details/84891567

关于此题,我觉得只要抓住三点即可。

  1. 给定的IP 地址总长度必须要不小于4,不超过12。比如1.1.1.1以及255.255.255.255
  2. 给定的IP 地址肯定是要分成4个部分的,每个部分子串的长度不超过3,并且该子串值的大小在[0, 255]之间。
  3. 还有一种特殊情况,就是字串中包含0。比如“010010”这种情况,该IP 地址对应的标准地址为["0, 100, 1, 0", "0, 10, 0, 10"]也就是0不能省略了,即切割完的IP地址长度与原地址长度相等

理解了这三点,就很好写代码了。

代码如下:

class Solution(object):
    # 本题采用回溯法解决
    # 注意点:IP地址空缺位不补0
    def restoreIpAddresses(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        # 定义包含所有可能的IP地址的列表
        address_list = []
        if len(s) < 4 or len(s) > 12:
            return address_list

        # 核心的递归算法
        def back(address=[], s=s):
            if len(address) == 4 and len(s) == 0:
                address_str = ".".join(address)
                if address_str not in address_list:
                    address_list.append(address_str)
                return
            for index in range(3):
                if len(s) >= index+1:
                    one_str = s[:index+1]
                    # 若出现"010010"情况,对于0的取舍需要着重考虑
                    # 关键一条就是:切割完的IP地址长度与原地址长度相等
                    if int(one_str) in range(256) and str(int(one_str)) == one_str:
                        one_str = str(int(one_str))
                        back(address+[one_str], s[index+1:])

        back()
        return address_list


if __name__ == "__main__":
    s = "010010"
    address = Solution().restoreIpAddresses(s)
    print(address)

不过执行效率还是很低,有点郁闷!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习的学习者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值