问题描述:
有效 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 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例:
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
输入:s = "0000"
输出:["0.0.0.0"]
输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
解题注意事项:
- 0和011 前者是合法的,三个数组合后的大小必须是0 < x < 256
- s的长度必须是小于12的
- 回溯for中不是每个元素,而是切割后的字符串
代码
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
res = []
path =[]
#判断数组中的数字是否合法
def isvalid(p):
if p =='0':return True
if p[0] == '0':return False
if 0 < int(p) < 256:return True
return False
def backtracking(s,startIndex):
# 递归终止条件
if len(s) > 12: return
if len(path) == 4 and startIndex == len(s):# 每次切割4,指针到末尾就返回
res.append('.'.join(path[:]))
return
for i in range(startIndex,len(s)):
if i +1 - startIndex >3: # 控制切割的长度
continue
p = s[startIndex:i+1]
if isvalid(p): #切割后的字符串有效则保存
path.append(p)
else:
continue
backtracking(s,i+1)
path.pop()
backtracking(s,0)
return res