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

【Leetcode152】分割回文串(回溯 | 递归)

文章目录

  • 一、题目
  • 二、思路
  • 三、代码

一、题目

在这里插入图片描述

二、思路

具体例子和步骤:假设 s = "aab",步骤如下:

  1. 初始状态

    • s = "aab"
    • path = []
    • res = []
  2. 第一层递归(外层循环):

    • path = []
    • 检查 s[:1]a(是回文):
      • 递归调用 dfs("ab", ["a"], res)
  3. 第二层递归

    • s = "ab"
    • path = ["a"]
    • 检查 s[:1]a(是回文):
      • 递归调用 dfs("b", ["a", "a"], res)
  4. 第三层递归

    • s = "b"
    • path = ["a", "a"]
    • 检查 s[:1]b(是回文):
      • 递归调用 dfs("", ["a", "a", "b"], res)
  5. 终止条件

    • s = ""
    • path = ["a", "a", "b"]
    • res 加入 path,即 res = [["a", "a", "b"]]
  6. 回溯并尝试新的分割

    • 回溯至 s = "ab"path = ["a"]
    • 检查 s[:2]ab(不是回文),跳过。
    • 回溯至初始状态,s = "aab"path = []
    • 检查 s[:2]aa(是回文):
      • 递归调用 dfs("b", ["aa"], res)
  7. 新的递归路径

    • s = "b"
    • path = ["aa"]
    • 检查 s[:1]b(是回文):
      • 递归调用 dfs("", ["aa", "b"], res)
  8. 终止条件

    • s = ""
    • path = ["aa", "b"]
    • res 加入 path,即 res = [["a", "a", "b"], ["aa", "b"]]
Initial call: dfs("aab", [])
|
|-- dfs("ab", ["a"])
|   |
|   |-- dfs("b", ["a", "a"])
|   |   |
|   |   |-- dfs("", ["a", "a", "b"]) --> Add to result [["a", "a", "b"]]
|   |
|   `-- dfs("b", ["a"]) -- "ab" 不是回文,跳过
|
`-- dfs("b", ["aa"])||-- dfs("", ["aa", "b"]) --> Add to result [["a", "a", "b"], ["aa", "b"]]

代码逻辑:

  • for i in range(1, len(s) + 1):循环从1开始到 len(s),尝试每一个可能的分割位置。
  • if self.isP(s[:i]):检查从0到 i 的子串 s[:i] 是否是回文。
  • self.dfs(s[i:], path + [s[:i]], res):如果 s[:i] 是回文,将 s[:i] 添加到路径 path 中,递归处理剩余的字符串 s[i:]

每次递归调用会传递新的字符串 s 和更新后的路径 path(这个路径即当前方案的所有字符组合列表),直到字符串 s 为空,此时将路径 path 添加到结果列表 res 中。这样,通过递归和回溯的方法,我们可以找到所有可能的分割方案。递归调用部分:

for i in range(1, len(s) + 1):if self.isP(s[:i]):self.dfs(s[i:], path + [s[:i]], res)
  • s[:i]:表示从字符串 s 的第1个字符到第 i 个字符形成的子串。
  • path + [s[:i]]:表示将当前找到的回文子串 s[:i] 添加到当前的 path 中形成一个新的列表。

三、代码

class Solution(object):def partition(self, s):""":type s: str:rtype: List[List[str]]"""res = []self.dfs(s, [], res)return res def dfs(self, s, path, res):"""s: 剩余的字符串path: 当前分割方案res: 保存所有分割方案的结果"""if not s:res.append(path)return for i in range(1, len(s) + 1):if self.isP(s[:i]):self.dfs(s[i:], path+[s[:i]], res)def isP(self, s):return s == s[::-1]
http://www.lryc.cn/news/441096.html

相关文章:

  • 基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)
  • 深入探究 Flask 的应用和请求上下文
  • C++学习笔记(30)
  • Rust GUI框架 tauri V2 项目创建
  • C++继承(上)
  • 在 Vim 中打开文件并快速查询某个字符
  • oracle 条件取反
  • 力扣最热一百题——缺失的第一个正数
  • 零基础入门AI:一键本地运行各种开源大语言模型 - Ollama
  • 3.接口测试的基础/接口关联(Jmeter工具/场景一:我一个人负责所有的接口,项目规模不大)
  • 【matlab】将程序打包为exe文件(matlab r2023a为例)
  • 从底层原理上解释clickhouse查询为什么快
  • FEAD:fNIRS-EEG情感数据库(视频刺激)
  • 标准库标头 <bit>(C++20)学习
  • redis群集三种模式:主从复制、哨兵、集群
  • 【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算
  • 基于yolov8的红外小目标无人机飞鸟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • 网络封装分用
  • 【Finetune】(一)、transformers之BitFit微调
  • ubuntu24系统普通用户免密切换到root用户
  • 如何应对pcdn技术中遇到的网络安全问题?
  • 【WRF工具】WRF Domain Wizard第一期:软件下载及安装
  • 使用CUBE_MX实现STM32 DMA功能 (储存器发送数据到外设串口)+(外设串口将数据写入到存储器)
  • 【JavaScript】数据结构之树
  • 【AI大模型】LLM主流开源大模型介绍
  • Uniapp的alertDialog返回值+async/await处理确定/取消问题
  • Spring Boot中的响应与分层解耦架构
  • 基于python+django+vue的图书管理系统
  • Oracle数据库安装与SQL*Plus使用
  • C#通过MXComponent与三菱PLC通信