代码随想录二刷 |回溯 |分割回文串

这篇具有很好参考价值的文章主要介绍了代码随想录二刷 |回溯 |分割回文串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

131.分割回文串

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]

解题思路

回溯三部曲

  • 递归函数参数
    全局变量数组path存放切割后回文的子串,二维数组result存放结果集

    参数还需要startIndex,因为切割过的地方不能重复切割。

    vector<string> path;
    vector<vector<string>> result;
    void backtracking(const string& s, int startIndex) 
    
  • 递归函数终止条件
    当切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。

    在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。

    void backtracking (const string& s, int startIndex) {
    	// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了。
    	if (startIndex >= s.size()) {
    		result.path_back(path);
    		return;
    	}
    }
    
  • 单层搜索的逻辑
    在循环中定义了起始位置startIndex,那么[startIndex, i]就是这个要截取的子串。

    首先判断这个子串是不是回文,如果是回文,就加入到vector<string> path中,path用来记录切割过的回文子串。

    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(); // 回溯过程,弹出本次已经添加的子串
    }
    

    接下来判断回文子串,使用双指针法,一个指针从前向后,一个指针从后向前,如果前后指针所指向的元素是相等的,就找到了回文字符串。文章来源地址https://www.toymoban.com/news/detail-821771.html

    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;
    }
    

代码实现

class Solution {
private:
	vector<vector<string>> result;
	vector<string> path;
	void backtracking(const string& s, int startIndex) {
		if (startIndex >= s.size()) {
			result.push_back();
			return;
		}
		for (int i = startIndex; i < s.size(); i++) {
			if (isPalindrome(s, startIndex, i)) {
				string str = s.substr(startIndex, i - stratIndex + 1);
				path.push_back(str);
			} else {
				continue;
			}
			backtracking(s, 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;
	}
};

到了这里,关于代码随想录二刷 |回溯 |分割回文串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录二刷day48

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    2024年02月07日
    浏览(92)
  • 代码随想录二刷day06

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 stream流写法

    2024年02月10日
    浏览(43)
  • 代码随想录二刷day17

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 二叉树中深度指的是根节点到当前节点的节点个数, 二叉树中的高度指的是当前节点到叶子节点的节点个数 可以通前序遍历求深度 通过后序遍历求高度 递归 递归 迭代 递归 迭代 递归 递归

    2024年02月09日
    浏览(47)
  • 代码随想录二刷day35

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    2024年02月07日
    浏览(66)
  • 二刷代码随想录——动态规划day40

    一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油! 二刷决定精刷了,于是参加了卡子哥的刷题班,训练营为期60天,我一定能坚持下去,迎来两个月后的脱变的,加油! 推荐一手卡子哥的刷题网站,感谢卡子哥。代码随想录 终于来到了守关boss。

    2024年03月11日
    浏览(57)
  • 代码随想录二刷-哈希表-几数之和 (JS)

    题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。 如果

    2023年04月18日
    浏览(40)
  • 代码随想录二刷 |二叉树 | 二叉树的右视图

    199.二叉树的右视图 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: [] 提示: 二叉树的节点个数的范围是 [0,1

    2024年02月04日
    浏览(61)
  • 代码随想录——回溯

    代码随想录——回溯 回溯的本质就是递归遍历,但在完成某一条路之后会撤回到上一层,然后重新选择另一条路继续遍历,是一个比较低效的算法,能进行提升的方式就是剪枝。 组合 链接:https://leetcode.cn/problems/combinations/description/ vectorvector int 作为最终返回的结果,vector

    2024年01月19日
    浏览(117)
  • 代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

    说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢, dp数组代表什么呢 ? 初始化是什么 , 遍历方式又是什么 ,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 有人一提到背包问题就只会使用动态规划来

    2024年02月06日
    浏览(76)
  • 代码随想录day24 开启回溯算法

    感觉回溯算法其实和递归很像,也是用递归的做法,也有三部曲,但又不太一样的地方是递归中类似二叉树,只有纵向遍历(一层层往下遍历,没有横向遍历),而回溯算法中多的for循环就是横向遍历,说实话这一点我没有理解的太深,只是知道它类似于两个for循环中的第一

    2024年01月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包