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

文章目录

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

一、题目

二、解法

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

cpp 复制代码
void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

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

  程序如下:

cpp 复制代码
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(n∗2n), n代表字符串长度。
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)。

三、完整代码

cpp 复制代码
# 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

相关推荐
Niuguangshuo7 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶7 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
高亦真8 小时前
今天是学习嵌入式的第37天
linux·学习·算法
罗西的思考10 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技11 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字32211 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
huang57914713 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_14 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
Elsa️74614 小时前
算法一周刷题总结
c++·算法
小小程序猴114 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法