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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python实时监控cpu小工具
Jun 21 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
基于python操作ES实例详解
Nov 16 Python
Django CSRF认证的几种解决方案
Mar 03 Python
python实现TCP文件传输
Mar 20 Python
如何在Python中创建二叉树
Mar 30 Python
Python的property属性详细讲解
Apr 11 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/10/09 PHP
PHP闭包函数详解
2016/02/13 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
用cssText批量修改样式
2009/08/29 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Python 获取div标签中的文字实例
2018/12/20 Python
python退出循环的方法
2020/06/18 Python
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
终端业务员岗位职责
2013/11/27 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
九一八事变演讲稿
2014/09/05 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
展览会邀请函
2015/02/02 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
面试通知短信
2015/04/20 职场文书
详解Python常用的魔法方法
2021/06/03 Python