1原题目
LeetCode_131
2 题目大意
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。
3.题目分析
4基础知识
回溯算法
4.1C的语法
4.2数据结构
4.3算法
回溯算法(解法1)
这里用到了DFS解决问题的思路, 同样这样的找出所有的可能性,我们使用了递归的思想。这里首先有一个辅助的函数 用于判断一个字符串是否是回文。然后在find_results中去找所有的可能性。应该明白在每一步都可以判断中间结果是否为合法结果,这里我们采用了回溯法
5解法
解法1:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> results;
vector<string> path;
if (s.empty()) return results;
int begin = 0;
find_results(s, path, results, 0);
return results;
}
void find_results(string s, vector<string>& path, vector<vector<string>>& results, int begin) {
// 如果begin已经到了size位置,则代表这次的寻找已经到头了,将结果压入results中,然后return
if (begin == s.size()) {
results.push_back(path);
return;
}
// 这里的循环是从begin开始 , 一直到结束
for (int i = begin; i < s.size(); ++i) {
// 首先判断, begin 到i是否为回文
if (is_par(s, begin, i)) {
// 如果是则将结果压入到path中
path.push_back(s.substr(begin, i - begin + 1));
// 再次从i+1的位置递归
find_results(s, path, results, i + 1);
// 找完之后回溯,把这个path弹出来
path.pop_back();
}
}
}
bool is_par(const string& s, int begin, int end) {
while (begin <= end && s[begin] == s[end]) {
begin++;
end--;
}
return begin >= end;
}
};
6.总结