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同时给两个收件人发送邮件的方法
Apr 30 Python
Python复制文件操作实例详解
Nov 10 Python
python列表的常用操作方法小结
May 21 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
python读取Excel实例详解
Aug 17 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
python打开windows应用程序的实例
Jun 28 Python
关于Tensorflow 模型持久化详解
Feb 12 Python
python实现3D地图可视化
Mar 25 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python selenium实现断言3种方法解析
Sep 08 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/04/18 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
跟我学Laravel之路由
2014/10/15 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
php提取微信账单的有效信息
2018/10/01 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
使用Python处理BAM的方法
2018/09/28 Python
Django中的ajax请求
2018/10/19 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
Python for循环与getitem的关系详解
2020/01/02 Python
python中def是做什么的
2020/06/10 Python
python与js主要区别点总结
2020/09/13 Python
HTML5制作表格样式
2016/11/15 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
软件测试题目
2013/02/27 面试题
优秀党员主要事迹
2014/01/19 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
商业用房租赁协议书
2014/10/13 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers