python 输入字符串生成所有有效的IP地址(LeetCode 93号题)

作者:TechFlow2019 时间:2022-09-06 00:16:57 

这题的官方难度是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和回溯的话不会很难。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

来源:https://www.cnblogs.com/techflow/p/13554144.html

标签:python,LeetCode,字符串,ip,地址
0
投稿

猜你喜欢

  • python顺序的读取文件夹下名称有序的文件方法

    2021-03-10 08:23:37
  • python 发送邮件的示例代码(Python2/3都可以直接使用)

    2023-05-12 08:53:56
  • js控制div弹出层实现方法

    2023-10-15 05:53:28
  • Dreamweaver使用中的7个常见问题与解答

    2007-11-03 11:34:00
  • asp内置对象ObjectContext详解

    2007-09-18 13:16:00
  • python文件读写操作与linux shell变量命令交互执行的方法

    2022-10-24 06:37:55
  • 详解Python中的__new__()方法的使用

    2022-09-26 09:03:56
  • python 爬取华为应用市场评论

    2023-08-31 23:18:32
  • python分别打包出32位和64位应用程序

    2023-11-03 04:41:10
  • 详解Python之可迭代对象,迭代器和生成器

    2022-09-30 02:11:06
  • python实现简单井字棋游戏

    2023-08-08 21:38:01
  • Python实现曲线点抽稀算法的示例

    2023-02-11 02:57:58
  • Django模型层实现多表关系创建和多表操作

    2022-12-01 09:13:46
  • 有关Server.Mappath详细接触

    2010-07-07 11:35:00
  • 将Python的Django框架与认证系统整合的方法

    2022-05-09 20:33:15
  • 使用 JScript 创建 .exe 或 .dll 文件

    2011-06-04 15:37:00
  • 一个简单的像素画小工具

    2010-01-01 15:33:00
  • python数字图像处理之对比度与亮度调整示例

    2021-02-13 19:33:19
  • Python+Pygame实现代码雨动画效果

    2023-12-03 18:43:57
  • Python中三种花式打印的示例详解

    2022-06-27 06:51:11
  • asp之家 网络编程 m.aspxhome.com