九江市建设监理有限公司网站适合30岁短期培训班
题目
- 分割回文串
给你一个字符串 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; // 返回所有有效分割方案}
};