题目
- 给一个字符串 s,对 s 分割成一些子串,每个子串都是回文串
- 返回所有分割的可能方案
思路
-
回溯题目的重点,就是设计递归结束的判断,每一轮遍历的时候怎么递归下去,以及递归结束回来之后的处理
-
本题目的每一轮递归就是
-
把当前 index 的字符添加到当前的字符串
-
判断是否为回文,
- 如果是,则记录,并清空当前字符串,并继续递归
- 递归结束之后,清除记录,并且恢复当前字符串
-
不是回文,以及回文递归结束回来之后,递归 index + 1
-
-
递归出口是,遍历到 s 的末尾,且当前的字符串为空
代码
class Solution {
public:
vector<vector<string>> ans;
bool check(string& s) {
int n = s.size();
for (int i = 0; i < s.size() / 2; i++) {
if (s[i] != s[n - i - 1]) return false;
}
return true;
}
void dfs(string& s, vector<string>& vec, string& tmp, int index) {
if (index == s.size()) {
if (tmp.empty()) ans.push_back(vec);
return;
}
tmp += s[index];
if (check(tmp)) {
vec.push_back(tmp);
tmp.clear();
dfs(s, vec, tmp, index + 1);
tmp = vec.back();
vec.pop_back();
}
dfs(s, vec, tmp, index + 1);
}
vector<vector<string>> partition(string s) {
vector<string> vec;
string tmp;
dfs(s, vec, tmp, 0);
return ans;
}
};