力扣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();}}
};