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


Posted in Python onOctober 15, 2020

这题的官方难度是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之再深点,更懂list
Sep 20 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python实现二维有序数组查找的方法
Apr 27 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
Python生成器以及应用实例解析
Feb 08 Python
python处理DICOM并计算三维模型体积
Feb 26 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
Python定义一个Actor任务
Jul 29 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 Python
Python基础学习之奇异的GUI对话框
May 27 Python
Django rest framework如何自定义用户表
Jun 09 Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 #Python
10款最佳Python开发工具推荐,每一款都是神器
Oct 15 #Python
matplotlib教程——强大的python作图工具库
Oct 15 #Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 #Python
详解pycharm配置python解释器的问题
Oct 15 #Python
详解查看Python解释器路径的两种方式
Oct 15 #Python
几款Python编译器比较与推荐(小结)
Oct 15 #Python
You might like
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
javascript的this关键字详解
2019/05/20 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python的动态重新封装的教程
2015/04/11 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
python实现xlsx文件分析详解
2018/01/02 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
最新远光软件笔试题面试题内容
2013/11/08 面试题
ajax是什么及其工作原理
2012/02/08 面试题
文明美德伴我成长演讲稿
2014/05/12 职场文书
小学运动会班级口号
2014/06/09 职场文书
单位更名证明
2015/06/18 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android