今天的题相对于昨天有点难
93. Restore IP Addresses
这道题是今天最难的,虽然和昨天的划分字串有点相似,但是涉及到对string的操作
Way1:
每次回溯的时候判断给原来的字符串加了几个点,如果是三个点就判断最后一段符不符合要求,其他的还是回溯的逻辑,对于字符串用+-去做append和pop,还有要判断当前段是不是valid的.valid有三个条件
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
res=[]
def valid(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 dfs(index,s,num_pointer):
if num_pointer==3:
if valid(s,index,len(s)-1):
res.append(s[:])
return
for i in range(index,len(s)):
if valid(s,index,i):
s=s[:i+1]+'.'+s[i+1:]
dfs(i+2,s,num_pointer+1)
s=s[:i+1]+s[i+2:]
else:
break
if len(s)>12:
return []
dfs(0,s,0)
return res
78. Subsets
这道题和之前的回溯差不多
Way1
每次回溯一个,回溯前先把上一个加到ressult里面.并且新的加入到当前的判断段里面
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def dfs(index):
if index>len(nums):
return
res.append(path[:])
for i in range(index,len(nums)):
path.append(nums[i])
dfs(i+1)
path.pop()
dfs(0)
return res
90. Subsets II
这道题和昨天的去重题是一样的
Way1:
在78题的基础上,判断一下当前元素是不是和上一个元素是一样的
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
nums.sort()
def dfs(index):
if index>len(nums):
return
res.append(path[:])
for i in range(index,len(nums)):
if i!=index and nums[i]==nums[i-1]:
continue
path.append(nums[i])
dfs(i+1)
path.pop()
dfs(0)
return res