题目描述:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]
方法1:
主要思路:
(1)递归加回溯;
class Solution {
public:
//判断当前字符串是否是回文串
bool is_valid(string& str){
if(str.size()==1){
return true;
}
int left=0;
int right=str.size()-1;
while(left<right){
if(str[left++]!=str[right--]){
return false;
}
}
return true;
}
//递归
void helper(string& s,vector<vector<string>>&res,int start,vector<string>&path){
//判断到了结尾
if(start==s.size()){
res.push_back(path);
return;
}
//递归找下一个位置
for(int i=start;i<s.size();++i){
//找下一个可能满足要求的子串
string str=s.substr(start,i-start+1);
if(is_valid(str)){//若下一个子串满足要求
//将下一个子串压入到结果中
path.push_back(str);
helper(s,res,i+1,path);//递归
path.pop_back();//复原
}
}
}
vector<vector<string>> partition(string s) {
vector<vector<string>> res;//存储结果
vector<string> path;//存储中间结果
helper(s,res,0,path);//递归
return res;
}
};