'''
93. 复原IP地址
给定一个只包含数字的字符串，复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址 正好由四个整数（每个整数位于 0 到 255 之间组成，且不能含有前导 0），整数之间用 '.' 分隔。
例如："0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址，但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。
示例 1：
输入：s = "25525511135"
输出：["255.255.11.135","255.255.111.35"]
示例 2：
输入：s = "0000"
输出：["0.0.0.0"]
示例 3：
输入：s = "1111"
输出：["1.1.1.1"]
示例 4：
输入：s = "010010"
输出：["0.10.0.10","0.100.1.0"]
示例 5：
输入：s = "101023"
输出：["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
 提示：
0 <= s.length <= 3000
s 仅由数字组成
'''
class Solution(object):
    def restoreIpAddresses(self, s):
        if len(s)<4 or len(s)>12:return []
        res = []
        path = []
        self.dfs(res,path,len(s),0,4,s)
        return res

    def dfs(self,res,path,length,start,num,s):
        if start == length:
            if num==0:
                res.append('.'.join(path))
            return
        for i in range(start,start+3):
            if i >length:break
            if num*3<(length-i):continue
            if self.judge(s,start,i):
                temp = s[start:i+1]
                path.append(temp)
                self.dfs(res,path,length,i+1,num-1,s)
                path.pop()

    def judge(self,s,start,end):
        length = end - start +1
        if length>1 and s[start]=='0':return False
        res = int(s[start:end+1])
        return res >=0 and res<=255