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 pickle 和 shelve模块的用法
Sep 16 Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
Aug 02 Python
Python读写文件基础知识点
Jun 10 Python
python django下载大的csv文件实现方法分析
Jul 19 Python
python logging.info在终端没输出的解决
May 12 Python
python中re模块知识点总结
Jan 17 Python
python数据抓取3种方法总结
Feb 07 Python
Python中的datetime包与time包包和模块详情
Feb 28 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 Python
关于Python使用turtle库画任意图的问题
Apr 01 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版(2)
2006/10/09 PHP
动易数据转成dedecms的php程序
2007/04/07 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
mouse_on_title.js
2006/08/25 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
Python基于DES算法加密解密实例
2015/06/03 Python
Flask数据库迁移简单介绍
2017/10/24 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
python Kmeans算法原理深入解析
2019/08/23 Python
pyqt5中动画的使用详解
2020/04/01 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
2014升学宴答谢词
2014/01/26 职场文书
初中班主任寄语
2014/04/04 职场文书
经济类毕业生求职信
2014/06/26 职场文书
学习十八大的心得体会
2014/09/01 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
医院见习报告范文
2014/11/03 职场文书
党性分析材料格式
2014/12/19 职场文书
让子弹飞观后感
2015/06/11 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android