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

回溯专题其二(分割篇)

一、分割类问题解题思路

分割类问题的特点是:

  • 我们需要在字符串中不断尝试放置“分割线”;
  • 每个切分后得到的子串必须满足一定条件;
  • 当分割线走到字符串末尾时,得到一个完整的方案。

因此,这类问题可以抽象为 在字符串中选择切割点的过程,也可以看作一类特殊的组合问题
回溯函数的核心参数通常是 当前分割线的起始位置 startIdx,递归结束条件是 startIdx 到达字符串末尾。

整体框架依然是“回溯三部曲”:

  1. 参数与返回值:参数包含原始字符串、起始位置等;返回值为空,结果存到全局变量。
  2. 递归终止条件:当分割线到达末尾,说明当前切分方案合法,加入结果。
  3. 单层递归逻辑:尝试在不同位置切割,判断子串是否合法,合法则递归下探,否则跳过。

二、具体代码实现

LeetCode 题单:

- **分割回文串 131**
- **复原IP地址 93**

1. 分割回文串 131

题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回所有可能的分割方案。

示例:
输入: "aab"
输出: [["aa","b"], ["a","a","b"]]

思路:

  • 递归参数:除了字符串自身 s 外,使用 startIdx 表示当前切割起点。
  • 终止条件:当 startIdx 到达末尾,说明得到了一种分割方案,加入结果。
  • 单层逻辑:从 startIdx 到末尾,依次尝试切割;若当前子串是回文串,则继续递归;否则跳过。

分割子字符串

class Solution:def isPalindrome(self, s: str, startIdx: int, endIdx: int) -> bool:# 判断子串是否为回文串(左闭右闭区间)while startIdx < endIdx:if s[startIdx] != s[endIdx]:return FalsestartIdx += 1endIdx -= 1return Truedef backtracking(self, s: str, startIdx: int) -> None:if startIdx >= len(s):self.result.append(self.path.copy())returnfor i in range(startIdx, len(s)):# 只有当前子串是回文时,才继续递归if self.isPalindrome(s, startIdx, i):self.path.append(s[startIdx:i+1])self.backtracking(s, i+1)self.path.pop()def partition(self, s: str) -> List[List[str]]:self.result = []self.path = []self.backtracking(s, 0)return self.result

2. 复原IP地址 93

题目:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

有效的 IP 地址:

  • 恰好由四段数字组成,每段在 0~255 范围内;
  • 不能有前导零;
  • . 分隔。

示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

思路:

  • 递归参数startIdx 表示当前段的起始位置,另用 dotCount 统计已放置的分隔符数。
  • 终止条件:当分隔符数为 3 且最后一段合法时,说明是一个有效 IP,加入结果。
  • 单层逻辑:尝试切分长度为 1~3 的子串,判断其是否在 0~255 且无前导零,合法则递归下探。
class Solution:def isValidIP(self, s: str, startIdx: int, endIdx: int) -> bool:# 左闭右闭区间if startIdx > endIdx:return False# 判断当前片段中是否存在前导0if s[startIdx] == '0' and startIdx != endIdx:return False# 判断对应整数范围是否在0-255之间val = int(s[startIdx:endIdx+1])if val >= 0 and val <= 255:return Truereturn Falsedef backtracking(self, s: str, startIdx: int, dotNum: int) -> None:# 已经添加了三个分割点,分割了三份。需要判断字符串剩余的部分是否符合IP地址的要求if dotNum == 3:if self.isValidIP(s, startIdx, len(s)-1):self.path.append(s[startIdx:])self.result.append('.'.join(self.path))self.path.pop()returnfor i in range(startIdx, len(s)):if not self.isValidIP(s, startIdx, i):breakself.path.append(s[startIdx:i+1])self.backtracking(s, i+1, dotNum+1)self.path.pop()def restoreIpAddresses(self, s: str) -> List[str]:self.result = []self.path = []if len(s) >= 4 and len(s) <= 12:self.backtracking(s, 0, 0)return self.result

三、小结

分割类问题的核心在于 如何合理地切分字符串

  • 131. 分割回文串:切分后要求每一段都是回文串。
  • 93. 复原 IP 地址:切分后要求每一段满足数值范围且无前导零。

二者的共同点是:

  • 都以 startIdx 为切割起点;
  • 都在每一层尝试不同的切割点;
  • 只有满足条件的子串才会继续递归。

区别则在于 子串合法性的判断逻辑

  • 回文串通过“左右双指针”判断;
  • IP 段通过“前导零检查 + 数值范围”判断。

从框架上看,这类问题与组合问题如出一辙:

  • 组合是 在集合中选数
  • 分割是 在字符串中切点
    所不同的 只是约束条件
http://www.sczhlp.com/news/55432/

相关文章:

  • 第2章:关系数据库
  • 怎么把网站黑了官方网站建设 在线磐石网络
  • 苏州网站建设自助建站模板大上海小程序开发
  • 商城网站备案需要什么企业内部网站建设
  • 平度做网站公司no7wordpress
  • 做网站需要技术如何免费制作微信小程序
  • 正规接单网站郑州营销型网站建设哪家好
  • 照明网站建设东莞找工作最新招聘信息
  • 网站制作交易流程设计公司装修图
  • 灯饰模板网站企业电子商务网站建设规划
  • 做淘宝店铺装修的公司网站做物流网站的公司
  • 布吉做棋牌网站建设网站的v2信誉认证怎么做
  • 用手机搭建自己的网站如何提升网站的转化率
  • 做菠菜网站好赚吗优质的南昌网站建设
  • 电子商务系统网站设计建站快车打电话
  • 网站需求分析是在建站的什么阶段做的_为什么要做?scala做网站
  • 网站建设及售后服务的说明书网站策划常用软件
  • 快速搭建网站推荐彩票网站怎么做系统
  • 网上做兼职网站正规北京朝林建设集团网站
  • 如何在外管局网站上做延期wordpress有自定义时间发布文章
  • 用域名访问网站几何背景生成网站
  • 做网站商丘安徽住房和城乡建设厅官网
  • 在线美图秀秀在线制作南京seo圈子
  • 手机测评做视频网站贵州省电力建设施工企业商会
  • 网站制作的页面比例php 图片上载 wordpress
  • 黄浦做网站朋友用我的vps做网站
  • 网站备案中查询wordpress 家装装修模板
  • 蓝色经典通用网站模板html源码下载天津建站商城
  • 一流的聊城网站建设计算机培训班有用吗
  • 模版网站利于优化p2p网站建设 上海