给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Solution{
public:
vector<vector<string> > partition(string s) {
vector<vector<string>> result;
vector<string> path;
if(s.size() == 0) {
return result;
}
dfs(s,0,s.size(),result,path);
}
void dfs(string &s,int begin,int len,vector<vector<string>> &result,vector<string> &path) {
if(begin == len) { //截取到了末尾,说明找到了1个解
result.push_back(path);
}
//从第begin位开始截取,最多可以截取len-begin位
for(int end = begin; end < len; end++) {
if(isHW(s,begin,end)) {
string sub_s = s.substr(begin,end-begin+1);
path.push_back(sub_s);
dfs(s,end+1,len,result,path);
path.pop_back(); //回溯
}
}
}
bool isHW(string str,int begin,int end) {
while(begin < end) {
if(str[begin++] != str[end--]) {
return false;
}
}
return true;
}
};
int main() {
string s;
vector<vector<string> > result;
cin>>s;
Solution solu;
result = solu.partition(s);
cout<<result.size()<<endl;
// cout<<"["<<endl;
// for(int i = 0; i < result.size();i++) {
// cout<<"[";
// for(int j = 0;j<result[i].size();j++) {
// cout<<result[i][j]<<",";
// }
// cout<<"]"<<endl;
// }
// cout<<"]"<<endl;
return 0;
}