一、描述
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
二、思路
使用回溯,每层把从剩下的子字符串选择连续的子串作为回文数,剩下的子字符串下层遍历。1.回溯 + 2.判断回文子串
class Solution {
public:
vector<vector<string>> res;
vector<string> path;
vector<vector<string>> partition(string s) {
dfs(s,0);
return res;
}
void dfs(string s,int flog){ //由于每次传递的是裁剪后剩下的子字符串,所以需要一个标志位来判断是否已经裁剪完成,也可以传递裁剪后的下标,不用标志位
if(flog==1){
res.push_back(path);
return;
}
for(int i=0;i<s.size();i++){ //每层深度取其中0-i的值作为回文数
if(is_back(s.substr(0,i+1))){
path.push_back(s.substr(0,i+1));
if(i==s.size()-1)
dfs(s,1);
else
dfs(s.substr(i+1,s.size()-i-1),0);
path.pop_back();
}
}
}
bool is_back(string s){ //判断是否为回文子串
int left=0,right=s.size()-1;
while(left<right){
if(s[left]!=s[right]) return false;
left++;
right--;
}
return true;
}
};