现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:
给出的字符串为"25525522135",
返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系)
数据范围:字符串长度
要求:空间复杂度
,时间复杂度
注意:ip地址是由四段数字组成的数字序列,格式如 "x.x.x.x",其中 x 的范围应当是 [0,255]。
"25525522135"
["255.255.22.135","255.255.221.35"]
"1111"
["1.1.1.1"]
"000256"
[]
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
# write code here
l = len(s)
ans = []
def dfs(_s, _q):
_l = len(_q)
_sl = len(_s)
if _l == 4 and not _sl:
ans.append(".".join(_q))
return
if not _sl:
return
if _sl > (4 - _l) * 3:
# 减枝
return
if _s[0] == "0":
dfs(_s[1:], _q + [_s[:1]])
# 前导0
return
for i in range(1, min(_sl, 3) + 1):
if int(_s[:i]) > 255:
break
dfs(_s[i:], _q + [_s[:i]])
dfs(s, [])
return ans class Solution:
def __init__(self):
self.res = []
self.tmp = []
def restoreIpAddresses(self , s: str) -> List[str]:
# write code here
n = len(s)
# 判断字符串长度是否合理
if n < 4&nbs***bsp;n > 12:
return self.res
self.dfs(s, 0, n)
return self.res
def dfs(self, s, start, n):
# 分割了4个数字 and 下标走到末尾
if len(self.tmp) == 4 and start == n:
self.res.append(".".join(self.tmp))
return
# 索引越界&nbs***bsp;分割出了4个数字还没到末尾
elif len(self.tmp) == 4&nbs***bsp;start >= n:
return
# 最长获取3个数字
for i in range(start, start + 3):
if i < n and 0<= int(s[start:i+1]) <= 255:
# 遇前导 0 则 return
if s[start] == "0" and i > start:
return
self.tmp.append(s[start:i+1])
self.dfs(s, i+1, n)
self.tmp.pop()
# 索引越界
else:
return # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param s string字符串 # @return string字符串一维数组 # class Solution: def recusion(self, res_str, cur_str, i): if i > 4: if res_str == "": self.vals.append(cur_str[1:]) return min_l = len(res_str) - 3 * (4-i) max_l = len(res_str) - 1 * (4-i) if min_l > 3: return if max_l < 1: return min_l = max(1, min_l) max_l = min(3, max_l) if max_l < min_l: return for j in range(min_l, max_l+1): temp = res_str[:j] int_v = int(temp) if str(int_v) != temp: continue if int_v <= 255 and int_v >= 0: self.recusion(res_str[j:], cur_str + "." + temp, i+1) def restoreIpAddresses(self , s: str) -> List[str]: # write code here self.vals = [] self.recusion(s, '', 1) return self.vals
class Solution:
def restoreIpAddresses(self , s: str) -> List[str]:
# write code here
# 对比用于跳出
full_length = 12
self.res = []
tmp = []
i = 0
def recur(i, tmp):
if len(tmp) > 4:
return
if i < len(s):
tmp.append(s[i:i+1])
i += 1
if len(tmp) == 4 and i == len(s):
self.res.append(".".join(tmp))
i -= 1
tmp.pop()
return
recur(i, tmp)
i -= 1
tmp.pop()
if i < len(s) - 1 and s[i] != '0':
tmp.append(s[i:i+2])
i += 2
if len(tmp) == 4 and i == len(s):
self.res.append(".".join(tmp))
i -= 2
tmp.pop()
return
recur(i, tmp)
i -= 2
tmp.pop()
if i < len(s) - 2 and int(s[i:i+3]) <= 255 and s[i] != '0':
tmp.append(s[i:i+3])
i += 3
if len(tmp) == 4 and i == len(s):
self.res.append(".".join(tmp))
i -= 1
tmp.pop()
return
recur(i, tmp)
i -= 3
tmp.pop()
recur(i, tmp)
return self.res 枚举所有分割点可能出现的位置,在根据分割点间数字的约束条件进行筛选,将合适的结果加入res
class Solution:
def restoreIpAddresses(self , s: str) -> List[str]:
res = []
i = 1
n = len(s)
while i < 4 and i < n - 2:
j = i + 1
while j < i + 4 and j < n - 1:
k = j + 1
while k < j + 4 and k < n:
if n - k >= 4:
k += 1
continue
a = s[:i]
b = s[i:j]
c = s[j:k]
d = s[k:]
if int(a) > 255 or int(b) > 255 or int(c) > 255 or int(d) > 255:
k += 1
continue
if (len(a) > 1 and a[0] == '0') or (len(b) > 1 and b[0] == '0') or (len(c) > 1 and c[0] == '0') or (len(d) > 1 and d[0] == '0'):
k += 1
continue
temp = a + '.' + b + '.' + c + '.' + d
res.append(temp)
k += 1
j += 1
i += 1
return res
class Solution:
def restoreIpAddresses(self , s: str) -> List[str]:
res = []
def dfs(s,ans):
if len(ans) == 4:
if len(s) == 0:
res.append(".".join(ans))
else:
return
l = min(3,len(s))
for i in range(l):
sub = s[:i+1]
if 0<=int(sub)<=255 and str(int(sub)) == sub:
ans.append(sub)
dfs(s[i+1:],ans)
ans.pop()
dfs(s,[])
return res #
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串
# @return string字符串一维数组
#
class Solution:
def restoreIpAddresses(self , s: str) -> List[str]:
# write code here
def justify(ss):
if ss == '0':
return True
if ss[0] == '0'&nbs***bsp;int(ss)>255:
return False
return True
res = []
def backtrack(st, pre):
nonlocal res
if not st and len(pre) == 4:
res.append('.'.join(pre))
elif st and len(pre) < 4:
for i in range(1, 4):
if i<=len(st) and justify(st[:i]): #判断i防止下标越界造成的重复解
backtrack(st[i:], pre+[st[:i]])
backtrack(s, [])
return res class Solution: def restoreIpAddresses(self , s: str) -> List[str]: # write code here res = [] def dfs(index,cur,cnt): # if indexlen(index) if index == len(s): if cnt == 4: res.append(cur[::]) return if s[index] == '0': if cnt < 3: dfs(index + 1,cur + '0' + '.',cnt + 1) if cnt == 3: dfs(index + 1,cur + '0',cnt + 1) else: for i in range(index+1,len(s)+1): # print(s[index : i]) if 1 <= int(s[index : i]) <= 255: if cnt < 3: dfs(i,cur + s[index : i] + '.',cnt + 1) if cnt == 3: dfs(i,cur + s[index : i],cnt+1) dfs(0,'',0) return res简单的回溯