题目
- 分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:
输入:s = “a”
输出:[[“a”]]
来源:力扣131. 分割回文串
思路(注意事项)
start是分割线
纯代码
class Solution {
private:
vector<string> path;
vector<vector<string>> ans;
bool ishuiwen(string& t, int i, int j)
{
while (i < j)
{
if (t[i] != t[j]) return false;
i ++, j --;
}
return true;
}
void backtracking (string& s, int start)
{
if (start == s.size())
{
ans.push_back(path);
return;
}
for (int i = start; i < s.size(); i ++)
{
if (ishuiwen(s, start, i)){
string str = s.substr (start, i - start + 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 ans;
}
};
题解(加注释)
class Solution {
private:
vector<string> path; // 存储当前分割路径
vector<vector<string>> ans; // 存储所有有效分割方案
// 判断子串是否是回文
bool ishuiwen(string& s, int i, int j) {
while (i < j) {
if (s[i] != s[j]) return false; // 如果字符不相等,则不是回文
i++, j--; // 向中间移动指针
}
return true; // 全部字符相等,是回文
}
// 回溯函数
void backtracking(string& s, int start) {
// 终止条件:分割到字符串末尾
if (start == s.size()) {
ans.push_back(path); // 保存当前有效分割方案
return;
}
// 遍历所有可能的分割点
for (int i = start; i < s.size(); i++) {
// 判断当前子串是否是回文
if (ishuiwen(s, start, i)) {
string str = s.substr(start, i - start + 1); // 提取回文子串
path.push_back(str); // 加入当前路径
backtracking(s, i + 1); // 递归处理剩余部分
path.pop_back(); // 回溯,移除当前子串
} else {
continue; // 如果当前子串不是回文,跳过后续操作
}
}
}
public:
vector<vector<string>> partition(string s) {
backtracking(s, 0); // 从第一个字符开始分割
return ans; // 返回所有有效分割方案
}
};