用自己的习惯写,卡了一天,放弃之
下为错误代码:
class Solution:
def back(self, s, index, point):
if point == 3:
if self.is_valid(s, index, len(s) - 1):
self.path.append(s[index:])
self.res.append('.'.join(self.path[:]))
return
for i in range(index, len(s)):
if self.is_valid(s, index, i):
self.path.append(s[index:i+1])
self.back(s, i + 1, point + 1)
self.path.pop()
else:
break
def is_valid(self, s, start, end):
if start > end:
return False
if s[start] == '0' and start != end:
return False
if int(s[start:end + 1]) > 255:
return False
return True
def restoreIpAddresses(self, s: str) -> List[str]:
self.path = []
self.res = []
self.back(s, 0, 0)
return self.res
对于输入"25525511135",输出为["255.255.11.135","255.255.11.111.35"],
正确的为["255.255.11.135","255.255.111.35"]
正确答案如下:
class Solution:
def back(self, s, index, point , cur):
if point == 3:
if self.is_valid(s, index, len(s) - 1):
cur += s[index:]
self.res.append(cur)
return
for i in range(index, len(s)):
if self.is_valid(s, index, i):
sub = s[index:i + 1]
temp = cur
cur += sub
cur += '.'
point += 1
self.back(s , i + 1 , point , cur)
point -= 1
cur = temp
else:
break
def is_valid(self, s, start, end):
if start > end:
return False
if s[start] == '0' and start != end:
return False
if int(s[start:end + 1]) > 255:
return False
return True
def restoreIpAddresses(self, s: str) -> List[str]:
self.res = []
self.back(s, 0, 0, '')
return self.res
值得注意的是,回溯过程中,必须先temp = cur 缓存一下,str不可变,不能直接改变str使之返回之前的状态。
class Solution:
def back_track(self , nums ,index):
if index == len(nums):
return
for i in range(index , len(nums)):
self.path.append(nums[i])
self.res.append(self.path[:])
self.back_track(nums , i+ 1)
self.path.pop()
return self.res
def subsets(self, nums: List[int]) -> List[List[int]]:
self.path = []
self.res = []
self.back_track(nums , 0)
self.res.append([])
return self.res
要在遍历的过程中收集单个结果,所以在for循环里append到res里,不过这样会漏掉空集,单独加上就好。
事实上,可以将搜集结果写到return语句上面,这样一进入递归函数,就立刻搜集path(从空集开始,遍历一个就搜集一个),这样不重不漏,如下
class Solution:
def back_track(self , nums ,index):
self.res.append(self.path[:])
if index == len(nums):
return
for i in range(index , len(nums)):
self.path.append(nums[i])
self.back_track(nums , i+ 1)
self.path.pop()
return self.res
def subsets(self, nums: List[int]) -> List[List[int]]:
self.path = []
self.res = []
self.back_track(nums , 0)
return self.res