《代码随想录》Ⅶ 回溯算法-分割 131. 分割回文串
努力学习!
题目:力扣链接
- 给你一个字符串
s,请你将s 分割成一些 子串,使每个子串都是 回文串 。返回s 所有可能的分割方案。
一、思想
这道题的核心思想是使用回溯算法来生成所有可能的回文子串分割方案。回溯算法通过递归的方式,逐步构建解空间树,并在过程中进行剪枝,以避免无效的搜索。具体来说,我们从字符串的起始位置开始,尝试将其分割成不同的子串,并检查这些子串是否为回文串。如果是回文串,则将其加入当前分割方案,并递归地处理剩余的字符串。如果当前分割方案中的所有子串都是回文串,则将其加入结果集。
二、代码
class Solution
{
public:
vector<vector<string>> res;
vector<string> path;
bool isPalindromic(string &str, int left, int right)
{
for (int i = left, j = right; i < j; ++i, --j) {
if (str[i] != str[j]) {
return false;
}
}
return true;
}
void backtracking(string str, int start)
{
if (start > str.size()) {
res.push_back(path);
return;
}
for (int i = start; i < str.size(); ++i) {
if (isPalindromic(str, start, i)) {
string s = str.substr(start, i - start + 1);
path.push_back(s);
}
else {
continue;
}
backtracking(str, i + 1);
path.pop_back();
}
}
vector<vector<string>> partition(string s)
{
res.clear();
path.clear();
backtracking(s, 0);
return res;
}
};
三、代码解析
1. 算法工作原理分解
1.1 回溯函数 backtracking
-
目的:递归地生成所有可能的回文子串分割方案。
-
实现:
-
终止条件:
- 如果
start 大于字符串str 的长度,说明当前分割方案中的所有子串都是回文串,将当前分割方案path 添加到结果集res 中。
- 如果
-
选择与递归:
- 从
start 开始遍历字符串str,尝试将其分割成不同的子串。 - 如果当前子串
str[start:i+1] 是回文串,则将其加入当前分割方案path 中。 - 递归调用
backtracking,并更新起始位置为i + 1,继续处理剩余的字符串。
- 从
-
回溯:
- 在递归调用返回后,将当前子串从
path 中移除,以便尝试其他可能的分割方案。
- 在递归调用返回后,将当前子串从
-
1.2 回文判断函数 isPalindromic
-
目的:判断给定子串是否为回文串。
-
实现:
- 使用双指针法,从子串的两端向中间遍历,检查对应字符是否相等。如果所有字符都相等,则子串是回文串。
1.3 分割生成函数 partition
-
目的:初始化并调用回溯函数,生成所有可能的回文子串分割方案。
-
实现:
- 初始化:清空结果集
res 和当前分割方案path。 - 调用回溯函数:从字符串的第一个字符开始,调用
backtracking 函数生成所有可能的分割方案。 - 返回结果:返回生成的所有分割方案。
- 初始化:清空结果集
2. 关键点说明
2.1 路径的选择与回溯
- 路径:
path 变量用于存储当前正在生成的分割方案。 - 选择:每次选择一个回文子串并将其添加到
path 中。 - 回溯:在递归调用返回后,将当前子串从
path 中移除,以便尝试其他可能的分割方案。
2.2 结果集的存储
- 结果集:
res 变量用于存储所有符合条件的回文子串分割方案。 - 添加条件:当
path 中的所有子串都是回文串时,将path 添加到res 中。
2.3 剪枝优化
- 剪枝:在递归过程中,如果当前子串不是回文串,则直接跳过,避免无效的搜索。
四、复杂度分析
-
时间复杂度:
O(N * 2^N)- 其中
N 是字符串s 的长度。最坏情况下,字符串的每个字符都可以作为分割点,因此时间复杂度为O(N * 2^N)。
- 其中
-
空间复杂度:
O(N)- 递归调用栈的深度最多为
N,因此空间复杂度为O(N)。此外,结果集res 的空间复杂度为O(2^N),但在通常情况下,我们只考虑递归栈的空间复杂度。
- 递归调用栈的深度最多为
白展堂:人生就是这样,苦和累你总得选一样吧?哪有什么好事都让你一个人占了呢。 ——《武林外传》


被折叠的 条评论
为什么被折叠?



