1.题目描述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
2.思路
对于这题要采用分割的思想,其核心也是回溯法,一条路走到底再回退。
如图所示:
每次调用backTrack函数就行一次分割,直到分割线处于最后一个元素之后将当前path压入集合。每次添加一条分割线,用ps记录下一次分割的起始位置,记得每次判断当前分割下来的字符串是否属于回文
3.代码
class Solution {
public:
vector<vector<string>> partition(string s) {
if(s.empty()){
return res;
}
vector<string> path;
backTrack(s, 0, path);
return res;
}
bool check(string &s, int i, int j){
if(j < i){
return true;
}
if(s[i++] == s[j--]){
return check(s, i, j);
}
else{
return false;
}
}
void backTrack(string s, int ps, vector<string>& path){
if(ps >= s.size()){
res.push_back(path);
return ;
}
for(int i = ps;i < s.size();++i){
if(check(s, ps, i)){
path.push_back(s.substr(ps, i-ps+1));
backTrack(s, i+1, path);
path.pop_back();
}
}
}
private:
vector<vector<string>> res;
};
4.复杂度分析
时间复杂度:
O
(
n
∗
2
n
)
O(n*2^n)
O(n∗2n),n为字符串的长度
空间复杂度:
O
(
n
)
O(n)
O(n)