python 输入字符串生成所有有效的IP地址(LeetCode 93号题)

 更新时间:2020年10月15日 11:31:13   作者:TechFlow2019  
这篇文章主要介绍了python 生成所有有效的IP地址的方法,帮助大家解答题目,学习python,感兴趣的朋友可以了解下

这题的官方难度是Medium,点赞1296,反对505,通过率35.4%。从各项指标来说看起来有些中规中矩,实际上也的确如此。这道题的解法和立意都有些显得新意不足,但总体来说题目的质量还是可以的,值得一做。

题意

给定一个由数字组成的字符串,我们希望通过这个字符串得到所有有效ip地址的组合。对于一个有效的ip地址而言,它应该有4个数字组成,每一个数字的范围在0到255之间。

一个字符串可能可以转化成多个ip地址,我们需要存储下来所有可以成立的情况。

样例

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

题解

这道题的题意蛮新颖的,将字符串和ip地址结合在了一起,但是题目的内核说实话有些老生常谈了,都是那种将一个大局面转化成若干个小局面之和的情况。

我们之前做的全排列问题、八皇后问题等等都是这种,拿八皇后问题举例,看起来是我们要在棋盘上放置皇后。但实际上我们最终想要的结果是放置好了八个皇后之后的局面,这个局面是由放置了每一个皇后之后的小局面组合在一起构成的。所以本质上也可以看成是小局面组装成大局面的问题。

说了这么多,其实只为了说明一点,就是遇到这些大局面拆分小局面的问题,我们可以率先考虑搜索算法。搜索算法除了可以理解成在一个搜索空间或者是一棵搜索树当中寻找到解之外,也可以理解成可以用来寻找一些小局面的组合,让它们组合起来可以构成我们想要的大局面。

套用到这道题上来,很显然最后我们想要的大局面是合法的IP地址,而构成这个大局面的小局面则是构成IP地址的每一个数字。

这些都搞明白了之后,代码就很好写了:

class Solution:
  def restoreIpAddresses(self, s: str) -> List[str]:
    n = len(s)
    if n < 4 or n > 12:
      return []
    
    ret = []
    
    def dfs(cur, ips):
      # 如果递归结束,并且ips当中刚好存了4个ip
      # 则生成答案
      if cur >= n:
        if len(ips) == 4:
          ret.append('.'.join(ips[:]))
        return
      
      # 遍历下一个ip是几位
      for i in range(cur, min(cur+3, n)):
        # 如果超过1位但是第一位是0,那么非法
        if s[cur] == '0' and i > cur:
          return
        # ip必须小于等于255
        num = int(s[cur: i+1])
        if num > 255:
          return
        
        # 回溯
        ips.append(s[cur: i+1])
        dfs(i+1, ips)
        ips.pop()
        
    dfs(0, [])
    return ret

总结

有些新意但是思路中规中矩的搜索问题,熟悉dfs和回溯的话不会很难。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

以上就是python 输入字符串生成所有有效的IP地址(LeetCode 93号题)的详细内容,更多关于python 生成IP地址的资料请关注脚本之家其它相关文章!

相关文章

  • 详解设计模式中的工厂方法模式在Python程序中的运用

    详解设计模式中的工厂方法模式在Python程序中的运用

    这篇文章主要介绍了设计模式中的工厂方法模式在Python程序中的运用,工厂方法模式主张程序在设计时要可以根据不同的条件生成各种类的实例,需要的朋友可以参考下
    2016-03-03
  • python控制结构的条件判断与循环示例详解

    python控制结构的条件判断与循环示例详解

    这篇文章主要为大家介绍了python控制结构的条件判断与循环示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 一文详解Python中复合语句的用法

    一文详解Python中复合语句的用法

    复合语句是包含其它语句(语句组)的语句;它们会以某种方式影响或控制所包含其它语句的执行。通常,复合语句会跨越多行,虽然在某些简单形式下整个复合语句也可能包含于一行之内。本文就来讲讲Python中复合语句的使用
    2022-07-07
  • Django前后端分离csrf token获取方式

    Django前后端分离csrf token获取方式

    这篇文章主要介绍了Django前后端分离csrf token获取方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python之Scrapy爬虫框架安装及使用详解

    Python之Scrapy爬虫框架安装及使用详解

    这篇文章主要为大家详细介绍了Python Scrapy爬虫框架安装及简单使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Django模板语法、请求与响应的案例详解

    Django模板语法、请求与响应的案例详解

    本文主要介绍了Django的模板语法、请求与响应,包括如何创建和渲染模板文件、传参机制、静态文件的引入以及如何处理GET和POST请求,通过综合小案例,展示了如何使用Django实现一个简单的登录页面并根据用户名密码进行验证,感兴趣的朋友跟随小编一起看看
    2025-01-01
  • Python安装后测试连接MySQL数据库方式

    Python安装后测试连接MySQL数据库方式

    这篇文章主要介绍了Python安装后测试连接MySQL数据库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 一篇文章带你了解python集合基础

    一篇文章带你了解python集合基础

    今天小编就为大家分享一篇关于Python中的集合介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • Python turtle.shape()用法及实战案例

    Python turtle.shape()用法及实战案例

    turtle是Python自带的一个小型的绘图库,它可以帮助我们快速地绘制简单的图形,这篇文章主要给大家介绍了关于Python turtle.shape()用法及实战案例的相关资料,需要的朋友可以参考下
    2024-03-03
  • Python中不同进制互相转换(二进制、八进制、十进制和十六进制)

    Python中不同进制互相转换(二进制、八进制、十进制和十六进制)

    这篇文章主要介绍了Python中不同进制互相转换,本文讲解了二进制、八进制、十进制和十六进制的相与转换实现代码,需要的朋友可以参考下
    2015-04-04

最新评论