93.复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
result=[]
self.backward(s,result,"",0,0)
#current是一个字符串
return result
def backward(self,s,result,current,startindex,pointnum):
if pointnum==3:
if self.isd(s,startindex,len(s)-1):
current+=s[startindex:len(s)]
#列表用append字符串直接加
result.append(current)
return
for i in range(startindex,len(s)):
if self.isd(s,startindex,i):
sub=s[startindex:i+1]
self.backward(s,result,current+sub+".",i+1,pointnum+1)
#不应该立即return
else:
break
def isd(self,s,start,end):
if start>end:
return False
if start!=end and s[start]=="0":
#start和end是下标值,s是字符串
return False
num=0
for i in range(start,end+1):
if not s[i].isdigit():
#注意isdigit用法
return False
num=num*10+int(s[i])
if num>255:
return False
return True
78.子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
result=[]
self.backward(nums,0,[],result)
return result
def backward(self,nums,startindex,current,result):
result.append(current[:])
for i in range(startindex,len(nums)):
current.append(nums[i])
self.backward(nums,i+1,current,result)
current.pop()
90、子集II
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
result=[]
nums.sort()
self.backtracking(nums,result,0,[])
return result
def backtracking(self,nums,result,startindex,cur):
result.append(cur[:])
uset=set()
for i in range(startindex,len(nums)):
if nums[i] in uset:
continue
cur.append(nums[i])
uset.add(nums[i])
#区分下标和真实值
self.backtracking(nums,result,i+1,cur)
cur.pop()