首页 > 编程语言 >【LeetCode回溯算法#05】分割回文串(复习双指针判断回文以及substr函数使用记录)

【LeetCode回溯算法#05】分割回文串(复习双指针判断回文以及substr函数使用记录)

时间:2023-03-09 23:34:21浏览次数:55  
标签:beginIndex 切割 05 int substr 回溯 回文

分割回文串

力扣题目链接

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

回文串 是正着读和反着读都一样的字符串。

示例 1:

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

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

思路

题意很好理解

这里主要有两个问题:

​ 1、怎么去切割字符串(即切割的方式)

​ 2、怎么判断回文

切割字符串

第一个问题老生常谈了,用for有局限性,所以用回溯

对照一下前面应用回溯来找组合的操作:

(组合)选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个.....。

(切割)切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段.....。

其实本质上是一样的

虽然说是这么说,但实际上是哪个东西执行的“切”这个动作呢?

因为我们需要指定遍历位置,因此和之前的问题一样需要使用beginIndex

而这个beginIndex就是“切割线”

例如:

在单层处理时,我们需要使用for来遍历字符串嘛,就有以下情况:

aabaa
↑  ↑
bI i

因为在初始化for的条件时,i是等于beginIndex的,经过循环,i会不断自增,相当于“切割线”不断右移

每次遍历,我们将当前字符串s的[beginIndex, i]区间输入给一个回文判断函数

若当前区间代表的子串是回文串,那么就使用substr函数将其截取下来保存

题外话:substr函数

该函数的简介

其输入是一个区间,举个例子:

test_str = "abb";
test_str.substr(0, 1);//cout->"a"
test_str.substr(0, 2);//cout->"ab"
test_str.substr();//cout->"abb"

可见,substr获取的子串是左闭右开的,即右边界的元素不获取

判断回文串

双指针法,没什么好说的

将待判断的子串的区间传入,作为遍历时的左右指针,然后遍历判断即可

//回文判断函数
    bool isPalindrome(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;
    }

代码

还是按回溯三部曲来写,直接给出代码了

有问题的地方详见注释

class Solution {
private:
    //定义回文判断函数
    bool isPalindrome(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;
    }
    //定义结果数组
    vector<vector<string>> res;
    vector<string> path;
    //确定回溯函数的参数和返回值
    void backtracking(string& s, int beginIndex){
        //确定终止条件
        //如果起始位置已经大于s的大小,说明已经找到了一组分割方案了
        if(beginIndex >= s.size()){
            res.push_back(path);
            return;
        }
        //确定单层处理逻辑
        for(int i = beginIndex; i < s.size(); ++i){
            //判断当前串是否为回文串
            if(isPalindrome(s, beginIndex, i)){//是回文串
                //获取s中从beginIndex到当前切割位置的子串
                //使用substr函数
                //i - beginIndex + 1是当前"切割线"的位置
                string cutStr = s.substr(beginIndex, i - beginIndex + 1);
                path.push_back(cutStr);
            }else{
                continue;//不是回文串就跳过
            }
            backtracking(s, i + 1);//递归
            path.pop_back();//回溯
        }
    }
public:
    vector<vector<string>> partition(string s) {
        backtracking(s, 0);
        return res;
    }
};

标签:beginIndex,切割,05,int,substr,回溯,回文
From: https://www.cnblogs.com/DAYceng/p/17201908.html

相关文章

  • 回文山
     /***@version1.0*@auther孙沐华*StringBuffer跟StingBuilder字符串内容是存在char[]value,所以在变化(增加/删除)*中不用每次都更换地址(即不是每次都......
  • mysql8.0 sql_mode 报错1055
    Mysql的8.0版本中默认是开启sql_mode=only_full_group_by。可能会导致1055报错,要关闭的话可以这样操作在MySQL下执行语句SELECT@@sql_mode将查询结果中的ONLY_FULL_GR......
  • 05、数据采集技术
    转载公众号《微言晓意》,仅用于个人学习大数据分析中的数据采集方式包括Logstash、Flume、Fluentd、Logtail等,本文对这几种数据采集技术进行简要介绍。LogstashLogstash......
  • 05、复杂事件处理(CEP)引擎简介
    目前已有的CEP引擎根据事件处理语言可以分为两大类:面向流和面向规则的CEP引擎。面向流的CEP引擎有MicrosoftStreamlnsight、OracleCEP、IBMSPADE、Esper等。而面向规则......
  • C#随记05
    方法方法在类或结构中声明,声明时需要指定访问级别,返回值,方法名称及方法参数,方法参数放在括号中,并用逗号隔开。括号中没有内容表示声明的方法没有参数。修饰符返回值类型......
  • (P05)从C到C++:内联函数,带参数宏,4种强制类型转化
    文章目录​​1.内联函数​​​​2.4种新的类型转换运算符​​1.内联函数当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系......
  • 22030559周月
    1.环境地址池的范围:192.168.61.20-1002.配置虚拟机的IP  3.安装DHCP安装步骤参考DNS服务的安装4.DHCP的配置进入配置界面  新建作用域  点击「下一步」......
  • 平衡车项目MPU6050编程感想
    0.发现延时函数没有用,延时1s,但是printf()的频率非常快,目前不知道原因,猜测与MPU6050的FIFO有关系。 1. 昨天读数据,同时读编码器和MPU6050的一个实验,如果编码器能读数,M......
  • 解决Git报“OpenSSL SSL_read: Connection was reset, errno 10054”错的问题
    1、......
  • LeetCode 105. 从前序与中序遍历序列构造二叉树
    原题解题目约束题解解法一classSolution{private:unordered_map<int,int>index;public:TreeNode*myBuildTree(constvector<int>&preorder......