前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 93 | 生成所有有效的IP地址

LeetCode 93 | 生成所有有效的IP地址

作者头像
TechFlow-承志
发布2020-08-04 10:19:21
1.2K0
发布2020-08-04 10:19:21
举报
文章被收录于专栏:TechFlowTechFlow

今天是LeetCode专题的第59篇文章,我们一起来看看LeetCode第93题,有效ip地址(Restore IP Addresses)。

这题的官方难度是Medium,点赞1296,反对505,通过率35.4%。从各项指标来说看起来有些中规中矩,实际上也的确如此。这道题的解法和立意都有些显得新意不足,但总体来说题目的质量还是可以的,值得一做。

题意

给定一个由数字组成的字符串,我们希望通过这个字符串得到所有有效ip地址的组合。对于一个有效的ip地址而言,它应该有4个数字组成,每一个数字的范围在0到255之间。

一个字符串可能可以转化成多个ip地址,我们需要存储下来所有可以成立的情况。

样例
代码语言:javascript
复制
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

题解

这道题的题意蛮新颖的,将字符串和ip地址结合在了一起,但是题目的内核说实话有些老生常谈了,都是那种将一个大局面转化成若干个小局面之和的情况。

我们之前做的全排列问题、八皇后问题等等都是这种,拿八皇后问题举例,看起来是我们要在棋盘上放置皇后。但实际上我们最终想要的结果是放置好了八个皇后之后的局面,这个局面是由放置了每一个皇后之后的小局面组合在一起构成的。所以本质上也可以看成是小局面组装成大局面的问题。

说了这么多,其实只为了说明一点,就是遇到这些大局面拆分小局面的问题,我们可以率先考虑搜索算法。搜索算法除了可以理解成在一个搜索空间或者是一棵搜索树当中寻找到解之外,也可以理解成可以用来寻找一些小局面的组合,让它们组合起来可以构成我们想要的大局面。

套用到这道题上来,很显然最后我们想要的大局面是合法的IP地址,而构成这个大局面的小局面则是构成IP地址的每一个数字。

这些都搞明白了之后,代码就很好写了:

代码语言:javascript
复制
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和回溯的话不会很难。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
    • 样例
    • 题解
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档