给你一个字符串 s
,请你将s
分割成一些子串,使每个子串都是
回文串
。返回 s
所有可能的分割方案。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a"
输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
思路,我们可以采用回溯算法,找到每一个字符串的组合,再判断是否是回文串,在回溯函数中,我们采用一个for循环更新容器大小用来截取字符串长度。
cpp
class Solution {
public:
vector<vector<string>>res;
vector<string>path;
bool is_fun(int left,int right,string s){
if(left>right)return false;
while(left<right){
if(s[left]!=s[right])return false;
left++;
right--;
}
return true;
}
void backtracing(int left,int right,string s){
if(left>right){
res.push_back(path);
return ;
}
for(int i=0;i<right-left+1;i++){
if(is_fun(left,left+i,s)){
path.push_back(s.substr(left,i+1));
backtracing(left+i+1,right,s);
path.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
backtracing(0,s.size()-1,s);
return res;
}
};
给定字符串大小除去上面方法外,我们还可以使用substr函数,我认为这样写更加清晰,在判断是否是回文串时可以直接重新计算字符串的left和right,像上面函数中写的,在调用is_fun函数时,我第一次写时传错参数is_fun(left.i,s)导致开头传错判断错误。
cpp
for(int i=1;i<=right-left+1;i++){
if(is_fun(s.substr(left,i))){
path.push_back(s.substr(left,i));
backtracing(left+i,right,s);
path.pop_back();
}