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定时器(Timer)用法简单实例
Jun 04 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
对python 通过ssh访问数据库的实例详解
Feb 19 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
python之列表推导式的用法
Nov 29 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 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 5.0 Pear安装方法
2006/12/06 PHP
PHP安全配置
2006/12/06 PHP
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
vue弹窗组件的实现示例代码
2018/09/10 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
Pycharm Git 设置方法
2020/09/15 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
财务会计专业毕业生自荐信
2013/10/19 职场文书
七年级历史教学反思
2014/02/05 职场文书
入党自我鉴定
2014/03/25 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
导游词之西安骊山
2019/12/03 职场文书