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编写脚本获取手机当前应用apk的信息
Jul 21 Python
Python中List.count()方法的使用教程
May 20 Python
Python进程间通信用法实例
Jun 04 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
python制作mysql数据迁移脚本
Jan 01 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
如何用Python绘制3D柱形图
Sep 16 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
浅谈Python数学建模之线性规划
Jun 23 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 创建标签云函数代码
2010/05/26 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
javascript学习之闭包分析
2010/12/02 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
Vue中计算属性computed的示例解读
2017/07/26 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
python 系统调用的实例详解
2017/07/11 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
python Opencv计算图像相似度过程解析
2019/12/03 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
Python正则表达式学习小例子
2020/03/03 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
总经理助理职责
2014/02/04 职场文书
个人自我评价范文
2014/02/05 职场文书
预备党员自我评价范文
2015/03/04 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书