题目描述:
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:
输入:s = “a”
输出:[[“a”]]
提示:
1 <= s.length <= 16
s 仅由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-partitioning
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析:
从index==0开始,递归判断所有可能,如果到达了字符串的末尾,则加入当前vector
代码:
class Solution {
public:
//判断回文
bool isParlindrom(const string &s){
int low=0;
int high=s.size()-1;
//双指针解决回文问题
while(low<high){
if(s[low]==s[high])
{
low++;
high--;
}
else
return false;
}
return true;
}
//递归解决子问题
void getPar(string &s,vector<vector<string>> &res,vector<string> &sub,int index){
//根据index判断递归出口
if(index>s.size())
return ;
//==s.size()时加入当前结果
if(index==s.size()){
res.push_back(sub);
return ;
}
//子问题长度不固定,需要循环列举
for(int i=1;i<s.size()-index+1;i++){
//如果当前字符串是回文
if(isParlindrom(s.substr(index,i)))
{
//cout<<s.substr(index,i)<<endl;
//如果当前符合加入sub中
sub.push_back(s.substr(index,i));
//递归判断子问题
getPar(s,res,sub,index+i);
//上层递归返回之后处理下一种可能,sub恢复原样
sub.pop_back();
}
else{
//不符合直接返回
continue;
}
}
}
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
vector<string> sub;
//index 从零开始
getPar(s,res,sub,0);
return res;
}
};