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

分割回文串(DFS)

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

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

DFS:

class Solution {
    vector<string> path;
    vector<vector<string>> v;
public:
    vector<vector<string>> partition(string s) {
        dfs(s, 0);
        return v;
    }

    void dfs(string s, int i){  //i 是一个索引,表示当前递归调用时正在考虑的子串的起始位置
        if (i == s.size()) { //当 i 达到字符串 s 的末尾时,说明找到了一个完整的回文分割方案
            v.push_back(path);
            return;
        }
        
        for(int j = i; j < s.size(); j++){
            if(is(s, i, j)){   // 如果 s[i:j] 是回文
                path.push_back(s.substr(i, j - i + 1));  // 加入当前子串到 path
                dfs(s, j + 1);   // 递归调用,从下一个索引开始继续分割
                path.pop_back();  // 回溯,撤销前面的选择
            }
        }


    }

    bool is(string& s, int left, int right){ //检查字符串 s 的 [left, right] 区间是否是回文。
          while(left < right){
            if(s[left++] != s[right--]){
                return false;
            }
        }
       return true;
    }
};

vector<string> path:用于存储当前分割方案中的回文子串

vector<vector<string>> v:存储所有符合条件的回文分割方案

dfs 函数在每次递归时,从位置 i 开始,检查从 ij 的每个子串是否是回文。一旦找到一个回文子串,就递归到下一个位置(即从 j + 1 开始),继续对剩余的字符串进行分割,直到整个字符串都被分割成回文子串为止。

path.push_back(s.substr(i, j - i + 1));

这一行代码的作用是将字符串 s 的一个子串添加到 path 中。

substr(i, len):用于提取从 i 开始,长度为 len 的子串。

  • i:子串的起始位置(从 0 开始)。
  • len:子串的长度。

http://www.kler.cn/a/384919.html

相关文章:

  • git提交冲突的原因及解决方案
  • Streamlit 入门使用指南及与 FastAPI 的配合使用
  • DeFi 4.0峥嵘初现:主权金融时代的来临
  • LangChain实际应用
  • 基于百度飞桨paddle的paddlepaddle2.4.2等系列项目的运行
  • 网络技术---网络通信概述
  • 技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代
  • explain执行计划分析 ref_
  • 【数据结构】Java 集合 Set 接口及其实现类的定义简介
  • 测试-正交表与工具pairs的介绍使用(1)
  • Qt字符编码
  • Matlab实现海马优化算法(SHO)求解路径规划问题
  • 倒计时3天 | 2024 CCF中国开源大会仪式解读
  • 高级AI记录笔记(一)
  • [卷积神经网络]使用YOLOv11训练自己的模型
  • SQL,力扣题目1709,访问日期之间最大的空档期
  • Oceanbase学习之一迁移mysql数据到oceanbase
  • 基于SSM的校园美食交流系统【附源码】
  • 缓存-基础概念
  • (蓝桥杯C/C++)——基础算法(下)
  • 【大模型推理加速技术】SIMD 与SIMT
  • leetcode:杨辉三角
  • 计算机网络:网络层 —— 网络地址转换 NAT
  • python datetime模块
  • C# 几个基础位运算
  • 如何获取另外一个APP内部控件的图片资源,而非网页内的图片,攻略来喽