1.题目描述
给你一个字符串 s,请你将s分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a"
输出:[["a"]]
2.代码
cpp
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> all_valid_result;
vector<string> current_path;
backtracking(s,all_valid_result,current_path);
return all_valid_result;
}
private:
bool is_palindrome(string s){
int left = 0;
int right = s.size()-1;
while(left <= right){
if(s[left]!=s[right])
return false;
left++;
right--;
}
return true;
}
void backtracking(string remain_str,
vector<vector<string>> &all_valid_result,
vector<string> current_path){
if(remain_str.size()==0){
all_valid_result.push_back(current_path);
return;
}
for(int i = 1; i<=remain_str.size();i++){
//先切割前i个
string current_candidate = remain_str.substr(0,i);
//回文才继续
if(is_palindrome(current_candidate)){
current_path.push_back(current_candidate);//加入当前路径['a','a']加入a
//从剩余字符串的第i个开始往后的字符串开始递归
backtracking(remain_str.substr(i),all_valid_result,current_path);
current_path.pop_back();
}
}
}
};