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为tornado添加recaptcha验证码功能
Feb 26 Python
Django视图和URL配置详解
Jan 31 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
Django中信号signals的简单使用方法
Jul 04 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
python numpy 反转 reverse示例
Dec 04 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
Jan 15 Python
20行Python代码实现视频字符化功能
Apr 13 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 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模块 Memcached功能多于Memcache
2011/06/14 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
JavaScript 指导方针
2007/04/05 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
Python获取apk文件URL地址实例
2013/11/01 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
wxPython实现列表增删改查功能
2019/11/19 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
高等教育学自荐书范文
2014/02/10 职场文书
违纪开除通知书
2015/04/25 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS