增加变量:pointsum,当有3个点,且startindex不超过len(隔板法通用),进入终止逻辑
终止逻辑:最后一段也valid,加入结果
!!!!string中没有insert和pop,自己写
class Solution(object):
def __init__(self):
self.res=[]
def insertchar(self,string, char, index):
return string[:index] + char + string[index:]
def deletechar(self, string, index):
return string[:index] + string[index+1:]
def _isvalid(self,s):
if len(s) > 1 and s[0] == '0':
return False
if int(s) > 255:
return False
return True
def restoreIpAddresses(self, s):
self.operation(s,0,0)
return self.res
def operation(self,s,pointsum,startindex):
if pointsum == 3 and startindex<len(s):
if self._isvalid(s[startindex:len(s)]):
self.res.append(s)
return
for i in range(startindex,len(s)):
if self._isvalid(s[startindex:i+1]):
pointsum += 1
s=self.insertchar(s,".",i+1)
self.operation(s,pointsum,i+2)
pointsum -= 1
s=self.deletechar(s,i+1)
简单,注意每层都记录即可
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
def subsets(self, nums):
self.res.append([])
self.backtracing(nums,0)
return self.res
def backtracing(self,nums,startindex):
if len(self.path)==len(nums):
return
for i in range(startindex,len(nums)):
self.path.append(nums[i])
self.res.append(self.path[:])
self.backtracing(nums,i+1)
self.path.pop()
使用used数组,记住两个犯错的点
if i>0 and nums[i-1]==nums[i] and self.used[i-1]==0:
continue
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
def subsetsWithDup(self, nums):
self.used=[0]*len(nums)
self.res.append([])
nums.sort()
self.backtracing(nums,0)
return self.res
def backtracing(self,nums,startindex):
if len(self.path)==len(nums):
return
for i in range(startindex,len(nums)):
if i>0 and nums[i-1]==nums[i] and self.used[i-1]==0:
continue
self.path.append(nums[i])
self.res.append(self.path[:])
self.used[i]=1
self.backtracing(nums,i+1)
self.used[i]=0
self.path.pop()