时间:2021-05-22
这题的官方难度是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地址的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
栈先来看一道题Leetcode32LongestValidParentheses(最长有效括号)给定一个只包含'('和')'的字符串,找出最长的包含有效括号的子
本文实例为大家分享了python3判断IP地址的具体代码,供大家参考,具体内容如下输入一串字符,判断该字符串是否为点分十进制的IP地址,若是则转换为16进制输出
本文实例讲述了Python字符串的全排列算法。分享给大家供大家参考,具体如下:题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串ab
python格式化字符串有%和{}两种字符串格式控制符.字符串输入数据格式类型(%格式操作符号)%%百分号标记#就是输出一个%%c字符及其ASCII码%s字符串
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,