93. Restore IP Addresses
# Runtime: 20 ms, faster than 99.80%; Memory Usage: 14.2 MB, less than 100.00%
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
res = []
def trackback(track, index, size):
if index >= size or len(track) == 3:
# 当index>=size表示,前边已经把数选完,无法满足len(track)等于4
# 当index+1 == size时,即最后一个数只剩1位,肯定满足
# 当index<size-1时,即最后一个数多于1位,所以要保证首位不为"0"且在0-255之间
if (index+1 == size) or (index < size-1 and s[index] != "0" and int(s[index:]) < 256):
track.append(s[index:])
res.append(".".join(track))
track.pop()
return
if s[index] == "0": # 当为"0"时,因为不能存在前置零,所以只有一种选择"0"
track.append("0")
trackback(track, index+1, size)
track.pop()
else:
for i in range(1,4): # 选择列表,因为每个数范围为0-255,所以最多为3位
tmp = int(s[index:index+i])
if tmp > 255: # 当该数大于255时,该选择无效
continue
track.append(s[index:index+i]) # 选择
trackback(track, index+i, size)
track.pop() # 撤销选择
track = []
trackback(track, 0, len(s))
return res