思路——回溯
- 单层分割路径 如“abc” 则有 a,ab,abc
- substr(begin,len)——记住第二个参数为len
- 回文串判断,只需对size=1特殊处理,其他进行反转判断是否相等
代码1(回文判断 利用反转)
class Solution {
vector<vector<string>> ans;
vector<string> path;
void backtracing(string& s, int startindex) {
if (startindex == s.size()) {
ans.emplace_back(path);
return;
}
for (int i = startindex; i <s.size(); ++i) {
string word = s.substr(startindex, i-startindex+1);
if (is_huiwen(word)) {
path.emplace_back(word);
backtracing(s, i+1);
path.pop_back();
}
}
}
bool is_huiwen(string& s) {
string new_s = s;
reverse(s.begin(), s.end());
return s == new_s;
}
public:
vector<vector<string>> partition(string s) {
backtracing(s, 0);
return ans;
}
};
代码2(回文判断 利用双指针)
class Solution {
vector<vector<string>> ans;
vector<string> path;
void backtracing(string& s, int startindex) {
if (startindex == s.size()) {
ans.emplace_back(path);
return;
}
for (int i = startindex; i <s.size(); ++i) {
string word = s.substr(startindex, i-startindex+1);
if (is_huiwen(word)) {
path.emplace_back(word);
backtracing(s, i+1);
path.pop_back();
}
}
}
bool is_huiwen(string& s) {
for(int i=0,j=s.size()-1;i<j;++i,--j)
if(s[i]!=s[j])
return false;
return true;
}
public:
vector<vector<string>> partition(string s) {
backtracing(s, 0);
return ans;
}
};