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标准日志模块logging的使用方法
Nov 01 Python
python实现12306火车票查询器
Apr 20 Python
Python基于回溯法子集树模板解决选排问题示例
Sep 07 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
python实现文件的备份流程详解
Jun 18 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
python爬虫 正则表达式解析
Sep 28 Python
python dumps和loads区别详解
Feb 04 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
python关于倒排列的知识点总结
Oct 13 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 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环境搭建最新方法
2006/09/05 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
PHP的全局错误处理详解
2016/04/25 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
Javascript浅谈之this
2013/12/17 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python中tell()方法的使用详解
2015/05/24 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
python实现中文文本分句的例子
2019/07/15 Python
python应用文件读取与登录注册功能
2019/09/23 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
python中return如何写
2020/06/18 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
高中家长寄语
2014/04/02 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
法律意见书范文
2015/05/20 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
创业计划书之农家乐
2019/10/09 职场文书