上报IP时,忽律了’.’,现在要还原所有原始IP的数量
输入是一个字符串,输出一行一个整数。
leetcode93
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
输入
8888
输出
1
思路:
每次dfs的时候都去检查一下所有的字符串的长度是不是能满足在最多4个3位数字组成。
用dfs的核心部分是要判断,结束dfs的边界,以及 dfs的结果 如何迭代存储,dfs下一个递归的输入。
该问题里:
每个合法的ip都有4个部分,从0到3来依次判断,只有四个部分都合法才是合法ip。
dfs(s,[],res)
这里s是剩余的字符串,path=[]用存合法ip的每个部分(迭代过程中长度<=4),res用来把所有合法的ip加到list里。
首先要考虑好所有结束dfs的情况,要直接return结束,也就是剩下字符串已经无法构成合法ip了。
还有就是字符串为空,path的长度为4,也就有4个合法部分,就把它加到res.
接着判断dfs下一次递归的条件。
要分析每一个ip的合法部分是怎么构成的,可以有0位到3位都可以。
这里要注意,如果剩下的字符串小于3位了,选择就只能用剩下字符串的长度来选。
所以遍历的时候 i要取2者的最小值 min(len(s),3)
那么第一部分的合法构成,就从0-i位算起。
这时候又要判断边界问题。如果当前ip部分第一位是0且长度还超过2 或者 大小超过255,说明这部分取值出来的是非法的ip部分,这个分支走不通,直接continue进入下一个分支。
然后就可以把合法的ip加到path里,然后下一次dfs里字符串会从i+1开始算。
代码:
class Solution(object):
def restoreIpAddresses(self, s):
"""
:type s: str
:rtype: List[str]
"""
res = []
'''
s是剩余的字符串,path是临时的List用来装每个ip的部分,
res用来装所有合法的ip字符串
'''
self.dfs(s, [], res)
return res
def dfs(self, s, path, res):
'''
path里装着已经合法的Ip部分,每部分最大长度为3,如果剩余的字符串
长度比剩下的ip部分的最大长度还要大,说明合法ip太短了,剩下的部分
太长,没法再构成合法的ip
'''
if len(s) > (4 - len(path)) * 3:
return
'''
如果剩余字符串s为空,且Ip部分的长度刚好为4,该ip就是正确的四个部分,
把这个list加到res里
'''
if not s and len(path) == 4:
res.append('.'.join(path))
return
'''
如果剩余字符串长度比3还小,就按剩余字符长度来遍历。
否则就按3来遍历。
当前部分是剩余字符串里 0到i(包括i)的字符串
如果当前ip部分第一位是0且长度还超过2 或者 大小超过255,说明
是非法的ip,这个分支走不通,直接continue进入下一个分支。
否则,这个分支是合法的,那就要把正确的Ip的部分加入到path里,
i前面的已经判断完了,下一波字符串从i+1开始判断。path和res都要传入,方便更新。
'''
for i in range(min(3, len(s))):
curr = s[:i+1]
if (curr[0] == '0' and len(curr) >= 2) or int(curr) > 255:
continue
self.dfs(s[i+1:], path + [s[:i+1]], res)
ipstr=input()
print(Solution().restoreIpAddresses(ipstr))
参考:
https://blog.csdn.net/fuxuemingzhu/article/details/80657420