题目:
426. 恢复IP地址
中文English
给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。
(你的任务就是往这段字符串中添加三个点, 使它成为一个合法的IP地址. 返回所有可能的IP地址.)
样例
样例 1:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
网上最详细的解释,每一步代码都有注释,是在不行,可以把代码中注释掉的print都输出一下,一目了然。
最需要注意地方就是每次传入的s都不一样,比如。第一次是原来输入的s=“25525511135” ,然后,取了第0部分的数字时s[0] = 2,那么第二次递归就是把s[1:] = “5525511135”传进去,同时ip变成了ip+‘.’+'s[0]'就会说‘.2’,这样的话最后的ip是形如“.***.***.***.***”,因此最后res.append()的时候是从ip的第一个开始,也就是要去掉第一个‘.’。
class Solution:
"""
@param s: the IP string
@return: All possible valid IP addresses
"""
def restoreIpAddresses(self, s):
# write your code here
#注意,每次dfs的时候传入的s都不一样
def dfs(s,sub,res,ip):
if sub == 4:
if s == '':
res.append(ip[1:])
return
#在s的前面取第sub部分的数字,可以取:
#s[:1]只有1位数字;s[:2]只有2位数字;s[:3]只有3位数字
#因为ip是0-255,最多3位数字,所以i是从1到3
for i in range(1,4):
#假设此时s = '35',那么此时i就没必要循环到3了
#因为本身这个s的长度都是2。
if i <= len(s):
#在第sub这部分取的数字的值要不大于255
if int(s[:i]) <= 255:
# print(sub,i,s[i:],ip+'.'+s[:i])
#取完了第sub部分,并且取好的ip是前面的ip+‘,’+s[:i](第sub部分取好的)
#那就递归的取第sub+1部分,此时传入的s不是原来的s,
#是取完第sub部分之后的s,也就是s[i:]
dfs(s[i:], sub+1, res, ip+'.'+s[:i])
#在取sub这部分数字时发现有‘0**’这种情况的,就停止,
#但是‘0’是可以的,此时sub部分数字就是‘0’,就好了。因此只可以循环一次
if s[0] == '0':
# print("taken once")
break
res = []
dfs(s, 0, res, '')
return res