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

【算法与数据结构】131、LeetCode分割回文串

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:本题仍然使用回溯算法的一般结构。加入了一个判断是否是回文串的函数,利用起始和终止索引进行判断,字符串使用引用输入, 减少传参的时间开销。将开始索引大于等于字符串长度作为终止条件,表示已经找到一个回文串的组合。此外,进一步改进算法的性能,可以建立一个查找数组,提前算出分割的子串是否为回文串,使用时直接判断即可。

在这里插入图片描述

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

  程序如下

class Solution {
private:vector<vector<string>> result;vector<string> path;bool isSymmetry(const string& s, const int start, const int end) {bool flag = true;for (int i = start, j = end; i <= j; i++, j--) {if (s[i] != s[j]) {flag = false;break;}}return flag;}void backtracking(const string& s, int startIndex) {if (startIndex >= s.size()) {result.push_back(path);return;}for (int i = startIndex; i < s.size(); i++) {if (isSymmetry(s, startIndex, i)) {	// 是回文串才加入结果数组string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);}else {	// 不是回文串跳过continue;}backtracking(s, i + 1);path.pop_back();}}
public:vector<vector<string>> partition(string s) {backtracking(s, 0);return result;}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n), n代表字符串长度。
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

三、完整代码

# include <iostream>
# include <string>
# include <vector>
using namespace std;class Solution {
private:vector<vector<string>> result;vector<string> path;bool isSymmetry(const string& s, const int start, const int end) {bool flag = true;for (int i = start, j = end; i <= j; i++, j--) {if (s[i] != s[j]) {flag = false;break;}}return flag;}void backtracking(const string& s, int startIndex) {if (startIndex >= s.size()) {result.push_back(path);return;}for (int i = startIndex; i < s.size(); i++) { // 剪枝优化if (isSymmetry(s, startIndex, i)) {	// 是回文串才加入结果数组string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);}else {	// 不是回文串跳过continue;}backtracking(s, i + 1);path.pop_back();}}
public:vector<vector<string>> partition(string s) {backtracking(s, 0);return result;}
};int main() {string s = "aab";Solution s1;vector<vector<string>> result = s1.partition(s);for (vector<vector<string>>::iterator it = result.begin(); it != result.end(); it++) {for (vector<string>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {cout << *jt << " ";}cout << endl;}system("pause");return 0;
}

end

http://www.lryc.cn/news/228254.html

相关文章:

  • 网络编程学习笔记
  • 腾讯待办停运后怎么办呢?导出的ics文件怎么打开查看
  • 家长群如何发成绩?
  • 数组区域检索的优化 --- 分块,线段树,树状数组
  • 若依侧边栏添加计数标记效果
  • WebSocket技术解析:实现Web实时双向通信的利器
  • 深圳联强优创手持PDA身份证阅读器 身份证核验手持机
  • 力扣labuladong——一刷day31
  • 里氏代换原则
  • Illumination Adaptive Transformer
  • 【教3妹学编程-算法题】给小朋友们分糖果 II
  • 应急响应练习2
  • JS算法练习 11.13
  • js升序排序
  • 2023亚太杯数学建模C题思路
  • 【ArcGIS Pro微课1000例】0030:ArcGIS Pro中自带晕渲地貌工具的妙用
  • 【原创】java+swing+mysql办公用品管理系统设计与实现
  • sqlalchemy查询数据为空,查询范围对应的数据在数据库真实存在
  • Code Former安装及使用
  • SpringMVC--@RequestMapping注解
  • ARM寄存器及功能介绍/R0-R15寄存器
  • js删除json数据中指定元素
  • 广州华锐互动:VR刑侦现场执法实训助力警察全面提升警务能力
  • 多线程 浏览器渲染引擎 图形用户界面(GUI,Graphical User Interface)应用程序
  • echarts饼图label显示不全原因?
  • 暖手宝上架亚马逊美国站UL499报告测试标准要求
  • 2023数据结构期中测验-2023秋-计算机+未来网络专业
  • 解锁内存之谜:从C到Python、Java和Go的内存管理对比
  • Redirect:301和302不同场景选择问题
  • ChromeDriver谷歌浏览器驱动下载安装与使用最新版118/119/120