当前位置: 首页 > backend >正文

LeetCode 93.复原IP地址 LeetCode 78.子集 LeetCode 90.子集II

LeetCode 93.复原IP地址

其实思想跟回文字符串那道题是类似的,但难点在于这道题的终止条件和判断是否IP地址进行划分后是否合理?

思路:

  • 通过一个int类型的全局变量来记载 " . " 的数目 / 记录你当前所获得的小数组的数目,如果 " . " 的数目为3,则证明你现在已经分割好了。但是你分割的不一定准确,因此你需要看你最后的" . "后面的数字数目,如果后面的数字数目大于3,则证明这是一个错误的分割。
  • 另外,当横向遍历的数字长度大于3时,后续的就可以不用进行遍历,如2255,2255.xxx是错误的表示。 
  • 其他的思路与“回文字符串” 类似

这道题难就难在,1. 对于数字的范围你需要判断是否正确。 2. 对于原字符串内里面存在有不是数字的元素,如果存在有元素不是数字的,那这个IP地址就肯定是不存在的。3. 你还需要判断0的情况,如果一个小数字字符串,第一个数字是0,但这个字符串长度不为1,那就是错误的分割方法。即开头数字不能为0,但允许有单个0的分割方法。 因此,is_Valid函数作为这道题的终止条件,具有关键的作用。

手撕Code:

class Solution(object):def restoreIpAddresses(self, s):""":type s: str:rtype: List[str]"""self.result = []self.path = []self.point = 0          ### 记录 "." 的数目self.backtracking(s, 0, self.point)return self.resultdef backtracking(self, num_str, start_index, point):if self.point == 3:if self.isValid(num_str, start_index, len(num_str)-1):self.path.append(num_str[start_index:])result = ".".join(list(self.path))self.path.pop()self.result.append(result)return for i in range(start_index, len(num_str)):if self.isValid(num_str, start_index, i):       cur_process = num_str[start_index:i+1]self.path.append(cur_process)self.point += 1self.backtracking(num_str, i+1, self.point)self.point -= 1self.path.pop()def isValid(self, num_str, start, end):         ### 判断start 到 end(包括end)的这个子数字符合条件吗if start > end:     ## 索引不正确return Falseif num_str[start] == '0' and start != end:        ### 首数字为0,并且数字长度大于1return Falsenum = 0for i in range(start, end + 1):     ## 左闭右开if not num_str[i].isdigit():          ## 字符串里存在不是数字的符号return Falsenum = num*10 + int(num_str[i])        ## 获得这个数字字符串的数字大小if num > 255:                   ## 数字范围为(0, 255)return Falsereturn True

不用point全局变量的实现方式,len(self.path) == 3时,表示三个 " . " 前的都处理好了,现在就是对最后的进行判断,如果判断后可以的话需要添加进去转换为IP地址格式后后,再pop掉。

        if len(self.path) == 3:if self.isValid(num_str, start_index, len(num_str)-1):self.path.append(num_str[start_index:])result = ".".join(list(self.path))self.path.pop()self.result.append(result)return for i in range(start_index, len(num_str)):if self.isValid(num_str, start_index, i):       cur_process = num_str[start_index:i+1]self.path.append(cur_process)self.backtracking(num_str, i+1, self.point)self.path.pop()

LeetCode 78.子集

LeetCode 90.子集II

http://www.xdnf.cn/news/7577.html

相关文章:

  • 【华为OD- B卷 - 书籍叠放 200分(python、java、c、c++、js)】
  • (05)数字化转型之生产制造:从通常的离散制造到柔性化生产的全景指南
  • 使用 OpenCV 实现万花筒效果
  • python实战项目70:如何给一个空的DataFrame添加行
  • Centos上搭建 OpenResty
  • python 提交命令 到远程windows中
  • Conda环境管理:确保Python项目精准复现
  • 十四、面向对象底层逻辑-BeanFactoryPostProcessor接口设计
  • std::vector<>.emplace_back
  • 演示:【WPF-WinCC3D】 3D工业组态监控平台源代码
  • 02 基本介绍及Pod基础排错
  • 企业网站架构部署与优化-Nginx网站服务
  • Flink并行数据源:ClickSource实现详解
  • 【C++】vector:容器的别样风采
  • 基于Spring Boot与jQuery的用户管理系统开发实践✨
  • 基于NLP技术的客户投诉与需求文本分类方法研究
  • Java中的集合详解
  • 如何进行燃气泄漏检测?
  • 针对 CSDN高质量博文发布 的详细指南
  • Javascript 编程基础(2)基础知识 | 2.2、变量
  • Day31
  • 阿里云服务器Ubuntu的git clone失败问题解决方案
  • C++中的宏
  • 【全网首发】知识库的批量导入以及更新
  • C#学习10——泛型
  • 股指期货模型,简单易懂的套利策略
  • DevExpress GridControl 复选列实时获取选中状态的解决方案
  • VMWare清理后,残留服务删除方案详解
  • bi报表是什么意思?如何制作一张bi报表?
  • 【算法-栈】深入栈模拟题:从题型特征到实现技巧