力扣HOT100之回溯:131. 分割回文串

这道题自己A的,思路也不算难,不过需要利用125.验证回文串这道题的基础,我们首先定义一个辅助函数,用于判断输入字符串是否为回文串,然后我们定义一个递归函数,用于搜索所有可能的结果。递归函数backtracking()接收3个参数,分别为string& s, string current和int n,s代表原始的字符串,current代表目前累计起来的字符子串,n代表现在正在处理下标为n处及以后的子串分隔问题。
当输入参数n恰好等于s的长度时,则直接触发终止条件,我们此时收获结果,将一个存储了若干个回文子串的向量加入到结果中,否则就还没结束,进入递归主逻辑。
在主逻辑中,我们定义一个一重循环,每循环一次,就说明下标i左侧的子串已经分割完毕,我们只需要考虑[i, s.size() - 1]范围内的字符如何分割即可。该循环从下标n开始,不断将s[i]添加到current的末尾,再判断current是否为回文子串,如果为回文串,则可以将current添加到路径中,此时从下标n到n + current.size() - 1处的子串就被分割出来,并添加到路径中了,我们就可以递归调用backtracking(s, "", n + current.size())探索下一段回文子串了。
class Solution {
public://辅助函数,判断是否为回文子串bool judge(string& s){int left = 0, right = s.size() - 1; //定义左右指针while(left < right){if(s[left] != s[right])return false;left++;right--;}return true;}vector<vector<string>> result; //记录所有的答案vector<string> path; //记录每一个合法的结果vector<vector<string>> partition(string s) {backtracking(s, "", 0);return result;}//递归函数void backtracking(string& s, string current, int n){//递归终止条件if(n >= s.size()){result.emplace_back(path);return ;}//递归主体for(int i = n; i < s.size(); i++){current += s[i];if(!judge(current)) continue; //无法构成回文串,进入下次循环path.emplace_back(current);backtracking(s, "", n + current.size()); //寻找下一段回文子串//回溯path.pop_back();}}
};
