'''
leetcode 93. 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
计数问题:
算法:构造递归树,递归+回溯
'''
class Solution:
def restoreIpAddresses(self, s: str):
input_list=[i for i in s]
output=[]
for item in self.helper(input_list,4):
output.append(''.join(list(map(lambda x:x+'.',item)))[:-1])
return output
def helper(self,input_list,num):
# 从字符串列表input_list中构造出长度为num的地址
'''
:param input_list: 输入必须是字符列表,列表中的每个元素是一个字符
:param num: 根据上述的字符串列表中按顺序构造出长度为多少的字符列表(列表中的每个元素可以是字符串或字符)
:return: 二维列表
'''
# print(input_list,num)
if len(input_list)==0:
return []
if num==0:
return []
if len(input_list) < num:
return []
if len(input_list) == num:
return [input_list]
if num==1:
if len(input_list)>3:
return [[]]
if len(input_list)==2:
if input_list[0]=='0':
return [[]]
else:
# print('jfidsjifd',input_list,[input_list[0]+input_list[1]])
return [[input_list[0]+input_list[1]]]
if len(input_list)==3:
if input_list[0]!='0' and int(input_list[0]+input_list[1]+input_list[2])<=255:
return [[input_list[0]+input_list[1]+input_list[2]]]
else:
return [[]]
result=[]
temp=input_list[0]
for right_seq in self.helper(input_list[1:],num-1):
if len(right_seq) == num - 1:
result.append([temp]+right_seq)
if temp!='0' and len(input_list)>=2:
temp=input_list[0]+input_list[1]
for right_seq in self.helper(input_list[2:],num-1):
# print('hsidahias',right_seq)
if len(right_seq)==num-1:
result.append([temp]+right_seq)
if len(input_list)>=3 and input_list[0]!='0' and int(input_list[0]+input_list[1]+input_list[2])<=255:
temp=input_list[0]+input_list[1]+input_list[2]
# print('here',temp)
for right_seq in self.helper(input_list[3:],num-1):
# print('skdfkdspfds',right_seq)
if len(right_seq) == num - 1:
# print('tight')
result.append([temp]+right_seq)
# print(input_list, num)
# print(result)
return result
if __name__=="__main__":
print(Solution().restoreIpAddresses("10269"))