分割回文串

力扣题目链接

给你一个字符串 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;
}
};

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

  1. 力扣算法:125-验证回文串,131-分割回文串---js

    LC 125-验证回文串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 注:回文串是正着读和反着读都一样的字符串. ...

  2. 【LeetCode回溯算法#07】子集问题I+II,巩固解题模板并详解回溯算法中的去重问题

    子集 力扣题目链接 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例 1: 输入:nums ...

  3. 【LeetCode回溯算法#06】复原IP地址详解(练习如何处理边界条件,判断IP合法性)

    复原IP地址 力扣题目链接(opens new window) 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 ...

  4. 【XSY2715】回文串 树链剖分 回文自动机

    题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...

  5. 51Nod - 1154 回文串划分(最少回文串dp)

    回文串划分 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式.   a|bb|aabaa - 3 个回文串 a|bb|a|aba|a - 5 个回文串 a|b ...

  6. BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)

    题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...

  7. 回溯算法————n皇后、素数串

    回溯就是算法是搜索算法中一种控制策略,是一个逐个试探的过程.在试探的过程中,如果遇到错误的选择,就会回到上一步继续选择下一种走法,一步一步的进行直到找到解或者证明无解为止. 如下是一个经典回溯问题n皇 ...

  8. LeetCode简单算法之分割平衡字符串 #1221

    在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的. 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串. 返回可以通过分割得到的平衡字符串的最大数量. 示例 1: 输入:s = ...

  9. 【LeetCode回溯算法#extra01】集合划分问题【火柴拼正方形、划分k个相等子集、公平发饼干】

    火柴拼正方形 https://leetcode.cn/problems/matchsticks-to-square/ 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] ...

  10. 【LeetCode回溯算法#08】递增子序列,巩固回溯算法中的去重问题

    递增子序列 力扣题目链接(opens new window) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例 1: 输入:nums = [4,6,7,7] ...

随机推荐

  1. awk的简单样例

    shell awk求和 当第一列相同时,对应的第二列相加 awk'{sum[$1]+=$2}END{for(c in sum){print c,sum[c]}}'输入文件名 在Shell中,我们可以用 ...

  2. 一文详解 Netty 组件

    作者:京东物流 张弓言 一.背景 Netty 是一款优秀的高性能网络框架,内部通过 NIO 的方式来处理网络请求,在高负载下也能可靠和高效地处理 I/O 操作 作为较底层的网络通信框架,其被广泛应用在 ...

  3. 希尔伯特变换用于解调系统——以解调调频信号为例,FM Demodulation

    What's The Hilbert Transform 简单地说,希尔伯特变换的物理意义为:把信号的所有频率分量的相位推迟90度,这样原信号和变换后信号可以视为一组IQ正交信号,在数字域正交化,可以 ...

  4. TC插件管理器及在TC中新建文件

    新建文件 Shift+F4可以新建文件,但是会调用内置的编辑器来打开. 在设置中通过修改F4快捷键对应的程序来修改. PS.F4编辑没找到根据扩展名来调用指定程序打开,可以F3中进行补充. NewFi ...

  5. python3 牛客网:OJ在线编程常见输入输出练习(ACM模式)

    牛客网: 校招笔试真题_C++工程师.golang工程师_牛客网 其他语言输入输出见链接 1.输入两个数,输入数据包括多组. while True: try: a = list(map(int,inp ...

  6. NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等

    NLP专栏简介:数据增强.智能标注.意图识别算法|多分类算法.文本信息抽取.多模态信息抽取.可解释性分析.性能调优.模型压缩算法等 专栏链接:NLP领域知识+项目+码源+方案设计 订阅本专栏你能获得什 ...

  7. 19.13 Boost Asio 发送TCP流数据

    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议.一般tcp::iostream会阻塞当前线程,直到IO操作完成. 首先来看服务端代 ...

  8. Python 实现进制转换与反汇编

    通过利用反汇编库,并使用python编写工具,读取PE结构中的基地址偏移地址,找到OEP并计算成FOA文件偏移,使用反汇编库对其进行反汇编,并从反汇编代码里查找事先准备好的ROP绕过代码,让其自动完成 ...

  9. C++遴选出特定类型的文件或文件名符合要求的文件

      本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法.   首先,我们来明确一下本文所需实现的需求.现在有一个文件夹,其中包含了很多文件,如下图所示:我们如果想获取其中所 ...

  10. 小知识:在Exadata平台上使用ExaWatcher收集信息

    在非Exadata平台上,我们通常会使用DBA已经很熟悉的OSW,如果有不熟悉的朋友可以参考我之前的随笔初步了解OSW: OSW 快速安装部署 OSW Analyzer分析oswbb日志发生异常 而在 ...