131. 分割回文串

131. 分割回文串

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

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

示例 1:

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

示例 2:

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

提示:

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

思路:

​ 使用回溯+备忘录。对于一个字符串s,将它分为两部分,第一部分为回文,然后把第二部分字符串进行同样的处理,直到字符串s遍历完。

​ 由于需要判断s中i到j是否是回文,所以会出现重复计算,使用备忘录记录。

class Solution {
public:
    vector<vector<string>>ans;
    vector<string>res;
    vector<vector<int>>memo;//备忘录
    vector<vector<string>> partition(string s) {
        memo.resize(s.size(),vector<int>(s.size(),-1));
        part(s,0,s.size());
        return ans;
    }
    void part(string s,int start,int end){
        //base case
        if(start>end)return;
        if(start==end){
            ans.push_back(res);
            return;
        }
        for(int i=start;i<end;i++){
            if(isPart(s,start,i)){//判断start到i是否是回文 如果是就对下一部分进行处理
                string temp="";
                for(int j=start;j<=i;j++)temp+=s[j];
                res.push_back(temp);
                part(s,i+1,end);//对i+1到end进行处理
                res.pop_back();
            }
        }
    }
    bool isPart(string s,int start,int end){
        if(memo[start][end]!=-1)return memo[start][end];
        int li=start;
        int ri=end;
        bool sig=true;
        while(li<=ri){
            if(s[li]!=s[ri])sig=false;
            li++;ri--;
        }
        memo[start][end]=sig==false?0:1;
        return sig;
    }
};
posted @ 2022-05-31 10:07  BailanZ  阅读(37)  评论(0编辑  收藏  举报