93.复原IP地址
文档讲解:代码随想录
视频讲解:
状态:大体上思路可以写出来。细节关于255的判断,elif len(s[startIndex:i+1]) == 3 and s[0]*100+s[1]*10+s[2] - '0' <= 255:报错TypeError: unsupported operand type(s) for -: 'str' and 'str' 。不能对字符串进行减法运算,需要先将字符串转换为整数,然后再进行比较!关于前导0的判断,也没写对。关于for循环的剪枝,没有进一步探索。
一方面要把所有的可能切割出来,一方面要筛选符合条件的 加入结果集。
可以运行对的初级版本:
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
self.path = []
self.results = []
self.backtracking(s,0)
return self.results
def backtracking(self,s,startIndex):
if len(self.path) == 4 and startIndex >= len(s): # 有效IP地址只能由四个整数组成,startIndex是分割线
ipAddress = ".".join(self.path) # 我想的是先用数组,之后再转为字符串,并用.分隔!
self.results.append(ipAddress)
return
for i in range(startIndex,len(s)):
# 在单层搜索逻辑中,判断子串是否合法,若合法才添加到path中并继续递归
if (len(s[startIndex:i+1]) > 1 and s[startIndex] == '0') or int(s[startIndex:i+1]) > 255:
# 注意当前子串是[startIndex,i]左闭右闭区间,第一个字母是s[startIndex],不是s[0]!
continue # 若子串含有前导0,或子串的值大于255,直接跳过当前循环
self.path.append(s[startIndex:i+1])
self.backtracking(s,i+1) # 递归时 startIndex +1
self.path.pop()
deepseek给出的意见,修改后:
关于for循环的剪枝,我觉得和 组合 问题中的不一样。
也可以说不是剪枝,而是一个必须的限制。如果不限制 IP 段长度:for i in range(startIndex, len(s))
可能生成超过 3 位的子串(如 i