LeetCode 131.分割回文串(回溯)

74 阅读1分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

131.分割回文串

给你一个字符串 s,请你将 **s **分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

示例 1:

输入: s = "aab"
输出: [["a","a","b"],["aa","b"]]

示例 2:

输入: s = "a"
输出: [["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

二、思路分析

这个题目让人比较困惑的就是字符串该如何分割,或者说分割应该怎么表示出来;然后就是如何在递归循环中截取子串。

我是用startindex来表示每次分割到哪里了。前面的题目中也使用过startindex,但还是让人有些糊涂。而且,在循环中需要截取符合要求的字符串,这需要两个参数,一个前一个后,仅仅只有一个startindex显然是没办法截取的。那另一个参数该是什么呢

最后就是判断该字符串是否是回文?这个用一个函数就可以验证。然后在for循环里,截取字符串的范围为[startindex,i]。接着就判断该截取的字符串是否为回文字符串,如果是的话,则通过backtracking进行递归,传入的参数startindex为i+1.不是的话则通过continue语句跳出该次循环,进行下一次循环。

三、AC代码

public:
    vector<string>path;
    vector<vector<string>>ans;
    bool judgehuiwen(string s,int start,int end){

        for(int i=start,j=end;i<j;i++,j--){
            if(s[i]!=s[j]){
                return false;
            }
        }
        return true;
    }
    void backtracking(string s,int startindex){
        if(startindex>=s.size()){
            ans.push_back(path);
            return;
        }
        for(int i=startindex;i<s.size();i++){
            if(judgehuiwen(s,startindex,i)){
                string temp=s.substr(startindex,i-startindex+1);
                path.push_back(temp);
            }
            else{
                continue;
            }
            backtracking(s,i+1);
            path.pop_back();
        }
    }
    vector<vector<string>> partition(string s) {
        backtracking(s,0);
        return ans;
    }
};

四、总结

很有一些难度,让人困惑