LeetCode-131 分割回文串
- 题目描述
- 解题思路
- C++ 代码
题目描述
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:
输入:s = “a”
输出:[[“a”]]
解题思路
B站题目讲解
在解决组合、排列、子集、切割问题时,我们选择使用回溯算法。
用指针 start 试着去切,切出一个回文串,基于新的 start,继续往下切,直到 start 越界
每次基于当前的 start,可以选择不同的 i,切出 start 到 i 的子串,我们枚举出这些选项 i:
- 切出的子串满足回文,将它加入部分解 path 数组,并继续往下切(递归)
- 切出的子串不是回文,跳过该选择,不落入递归,继续下一轮迭代
C++ 代码
class Solution {
public:
vector<vector<string>> partition(string s) {
back_tracking(s, 0);
return res;
}
private:
vector<vector<string>> res;
vector<string> path;
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;
}
void back_tracking(string& s, int index) {
if (index >= s.size()) {
res.push_back(path);
return;
} else {
for (int i = index; i < s.size(); i++) {
if (isPalindrome(s, index, i)) {
path.push_back(s.substr(index, i - index + 1));
} else {
continue;
}
back_tracking(s, i + 1);
path.pop_back();
}
}
}
};