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访问纯真IP数据库的代码
May 19 Python
Python实例一个类背后发生了什么
Feb 09 Python
Python程序中的观察者模式结构编写示例
May 27 Python
详谈Python基础之内置函数和递归
Jun 21 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python基于matplotlib实现绘制三维图形功能示例
Jan 18 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
python3实现mysql导出excel的方法
Jul 31 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
Aug 04 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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
Terran剧情介绍
2020/03/14 星际争霸
用PHP实现登陆验证码(类似条行码状)
2006/10/09 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
php的文件上传入门教程(实例讲解)
2014/04/10 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
[52:40]完美世界DOTA2联赛PWL S2 Magma vs GXR 第一场 11.29
2020/12/02 DOTA
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
Python求算数平方根和约数的方法汇总
2016/03/09 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
审计主管岗位职责
2014/01/31 职场文书
党员个人公开承诺书
2014/08/29 职场文书
承诺书样本
2014/08/30 职场文书
大学生见习报告总结
2014/11/04 职场文书
2015年工程师工作总结
2015/04/30 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs