首页 > 其他分享 >代码随想录Day23

代码随想录Day23

时间:2024-08-22 20:26:46浏览次数:7  
标签:子串 切割 代码 随想录 Day23 startIndex result path 回文

131.分割回文串

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

示例 1:

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

示例 2:

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

提示:

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


正解(回溯)

其实切割问题和组合问题本质上是一样的。
那么切割问题就也可以抽象成树:

递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。

  1. 递归函数参数
    全局变量数组path存放切割后回文的子串,二维数组result存放结果集。 (这两个参数可以放到函数参数里)
    本题递归函数参数还需要startIndex,因为切割过的地方,不能重复切割,和组合问题也是保持一致的
  2. 递归函数终止条件

    从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。
    那么在代码里什么是切割线呢?
    在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。
  3. 单层搜索的逻辑
    来看看在递归循环中如何截取子串呢?
    首先判断这个子串是不是回文,如果是回文,就加入
上代码(●'◡'●)
class Solution {
private:
    vector<vector<string>> result;
    vector<string> path; // 放已经回文的子串
    void backtracking (const string& s, int startIndex) {
        // 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了
        if (startIndex >= s.size()) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i < s.size(); i++) {
            if (isPalindrome(s, startIndex, i)) {   // 是回文子串
                // 获取[startIndex,i]在s中的子串
                string str = s.substr(startIndex, i - startIndex + 1);
                path.push_back(str);
            } else {                                // 不是回文,跳过
                continue;
            }
            backtracking(s, i + 1); // 寻找i+1为起始位置的子串
            path.pop_back(); // 回溯过程,弹出本次已经添加的子串
        }
    }
    bool isPalindrome(const string& s, int start, int end) {
        for (int i = start, j = end; i < j; i++, j--) {
            if (s[i] != s[j]) {
                return false;
            }
        }
        return true;
    }
public:
    vector<vector<string>> partition(string s) {
        result.clear();
        path.clear();
        backtracking(s, 0);
        return result;
    }
};

标签:子串,切割,代码,随想录,Day23,startIndex,result,path,回文
From: https://www.cnblogs.com/Murder-sans/p/18374684/dmsxl_Day23

相关文章

  • 「代码随想录算法训练营」第四十四天 | 图论 part2
    200.岛屿数量题目链接:https://leetcode.cn/problems/number-of-islands/description/文章讲解:https://programmercarl.com/kamacoder/0099.岛屿的数量深搜.html题目难度:中等题目状态:看题解思路一:深搜版方法dfs:参数:接受一个字符网格grid和当前坐标(r,c)。功能:......
  • 给自己复盘的随想录笔记-移除元素
    双指针法双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。定义快慢指针快指针:寻找新数组的元素,新数组就是不含有目标元素的数组慢指针:指向更新新数组下标的位置相关题目删除有序数组中的重复项解题思路:解法:双指针首先注意数组......
  • 给自己复盘用的随想录笔记day1-二分查找
    二分法使用情景数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。求某一个整数的平方根边界条件写二分法......
  • git revert操作引起的代码丢失以及解决方案
    场景如下:某项目下有很多开发中的分支,比如分支a,b,c,d都合并到了一个test分支上;某次误操作将test分支内容合到了分支e上,然后紧接着又revert了这次合并,试图撤销合并;接着将分支e合并master上线;过了若干天,将master再合并到a,b,c,d分支上时,发现之前修改的代码被合并丢掉了。这时候你......
  • 【PHP安全】demo3:最简单的php代码加密方法
    当我们说"PHP代码加密",我理解的是将PHP代码进行混淆或加密,以防止源代码被他人轻易阅读或修改。这种需求通常用于保护商业秘密或加强代码安全性。常见的工具是使用专业的编译器和加密工具。然而,请注意,完全保护代码是不可能的,因为最终服务器仍然需要能够执行解密后的代码。以......
  • 如何在word/wps中添加代码,并且保持源代码风格
    一、HighlightCode在线工具https://highlightcode.com二、操作步骤1、将代码复制到框中 2、点击右上方的高亮代码 3、得到如下代码样式 4、将代码复制到Word/Wps中即可,效果如下图所示 ......
  • CH58x/59x SPI0代码参考
    前言:代码参考为首字节模式和数据流模式,均使用DMA,建议使用数据流DMA。一、数据流/首字节收发代码参考数据流流程:主机定时器1ms间隔发送;从机接收数据;从机填入发送数据到DMA并通知主机接收;主机DMA接收数据;首字节流程:主机定时器1ms间隔发送;从机首字节接收并DMA接收完整数......
  • 别人运行的好好的R代码,到我这怎么就冲突了?你应该这么做!!!
    培训时,同一段代码,大家都运行的好好的,而你却出现问题了,一般都是考虑包里的函数冲突了。这时需要一个个去排查到底是哪个函数发生了冲突,有没有更好的办法呢?本文介绍一个包conflicted,可以列出所有冲突的函数,并可以设置优先使用哪个函数来处理冲突。包的安装install.packages("c......
  • 安防视频监控EasyCVR视频汇聚平台出现代码层面报错“panic:runtime error”的原因排查
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等。有用户反馈,启动EasyCVR......
  • android调用h5代码步骤
    要在Android应用中调用H5代码,可以使用WebView来加载并执行H5代码。以下是一个简单的示例:首先,在你的Android项目中的布局文件中添加一个WebView组件:```xml<WebView  android:id="@+id/webview"  android:layout_width="match_parent"  android:layout_height="......