LeetCode-笔记-131. 分割回文串

LeetCode-笔记-131. 分割回文串

131. 分割回文串

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

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

示例 1:

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

示例 2:

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

思路在代码里:

如下图所示:aab先拆成a,ab,在a是回文串的情况下再拆ab,ab可以拆成a,b与ab,ab不是回文串顾舍去,最终得到a,a,b。然后再拆成aa,b。同理拆成aab时aab不是回文串舍去。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YeOm92zy-1619670009162)(C:\Users\wei\AppData\Roaming\Typora\typora-user-images\image-20210429121645365.png)]

class Solution {
public:
    vector<string> vs; //定义字符串容器
    vector<vector<string>> vvs;//定义二维字符串容器
    
    bool isPali(string _s,int start,int end,vector<vector<int>> &mn){//判断是否是回文串,起始位置start,末位置end
        int i=start;
        int j=end;
        while(start<end){
            if(_s[start]==_s[end]) {
                start++;
                end--;
            }
            else{
                mn[start][end]=2;
                return false;
            }
        }
        mn[i][j]=1;
        return true;
    }
    void dfs(int addr,string s,vector<vector<int>> &mn){//递归,分割字符串,并判断是否是回文串
        if(addr==s.size()){
            vvs.push_back(vs);
            return;
        }

        for(int i=addr;i<s.size();++i){
            //cout<<addr<<"***"<<i<<endl;
            //cout<<isPali(s,addr,i)<<endl;
            if(mn[addr][i]==2) continue;
            if(mn[addr][i]==1||isPali(s,addr,i,mn)){
                vs.push_back(s.substr(addr, i - addr + 1));
                dfs(i+1,s,mn);
                vs.pop_back();
            }
        }
    }
    vector<vector<string>> partition(string s) {
        vector<vector<int>> mn(s.size(),vector<int>(s.size(),0));//记忆数组避免重复判断
        dfs(0,s,mn);
        return vvs;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值