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中pass语句用法实例分析
Apr 30 Python
python使用PIL模块实现给图片打水印的方法
May 22 Python
python删除过期文件的方法
May 29 Python
让python在hadoop上跑起来
Jan 27 Python
TensorFlow如何实现反向传播
Feb 06 Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 Python
python:print格式化输出到文件的实例
May 14 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
Python中过滤字符串列表的方法
Dec 22 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简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
js最简单的拖拽效果实现代码
2010/09/24 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
Javascript window对象详解
2014/11/12 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
详解angularjs popup-table 弹出框表格指令
2017/09/20 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
夜大毕业生自我鉴定
2013/10/31 职场文书
大学生怎样进行自我评价
2013/12/07 职场文书
中学生班主任评语
2014/01/30 职场文书
三个儿子教学反思
2014/02/03 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
最常使用的求职信
2014/05/25 职场文书
暑期培训班招生方案
2014/08/26 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
销售经理助理岗位职责
2015/04/13 职场文书