给你一个字符串s,请你将s分割为一些子串,使每个子串都是回文串。返回s所有可能的分割方案
下面是C++源代码
class Solution{
public:
//要求划分后原串的各个部分都是回文,所有先划分一部分应该使用回溯算法,先枚举起点
vector<string>res;//res容器用来装判断结果
vector<vector<string>>ans;//ans容器用来装res容器
void dfs(string &s, int start)//深度优先搜索
{
if(start >= s.size())//可以一直划分到最后说明可以划分为字符串
{
ans.push_back(res);//加入答案
return;
}
for(int i= start;i<s.size();i++){//循环字符串寻找回文串
if(isPalinddrome(s,start,i))//如果为回文
{
string str = s.substr(start,i-start+1);
res.push_back(str);//暂存结果
dfs(s,i+1);//继续划分i+1-s.size()-1
res.pop_back();//如果不能划分为回文串,就使用回溯
}
}
}
bool isPalinddrome(string &s, int i, int j)//判断是否为回文
{
while(i<j){
if(s[i]==s[j]){//使用双指针,一个指向首,一个指尾,都朝字符串中间遍历
i++,j--;}
else
return false;
}
return true;
}
vector<vector<string>> partition(string s)
{
dfs(s,0);
return ans;
}
};
解析放在代码中了,如有需要自行修改即可。