现在有一个只包含数字的字符串,将该字符串转化成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简单的回溯