分割字符串--回溯法经典应用

33 篇文章 0 订阅
3 篇文章 0 订阅

分割回文串

分割回文串给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

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

class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>> result;
        vector<string> middle;
        //partitionHuiString(result,s,0,s.size()-1);
     
        partition2(s,0,middle,result);
        //if(isHui("aa",0,1)) cout<<"aa是回文"<<endl;
        
        return result;
    } 
    /*void partition2(string s,int start,int end,vector<vector<string>> &result)
    {
        vector<string> middle;
        for(int end=start; end<=s.size();end++){
            string str = s.substr(start,end-start);
            string str2 = s.substr(0,start-0+1);
            string str3 = s.substr(end,s.size()-end+1);
            //cout<<str<<" ";
            middle.push_back(str2);
            middle.push_back(str);
            middle.push_back(str3);
        }
    }*/
    //没错,起点也在从0开始增加。终点可以不传入,因为对于每个起点来说,终点都是变化的,都是当前这个起点往后推到最后是终点。因为怕重复,所以要从每个partition里面他们再自己调用后面的?当然可以,但也可以不用吧。
    void partition2(string s,int start,vector<string> &middle, vector<vector<string>> &result)
    {
        if(start==s.size()) 
        {
            result.push_back(middle);
            
            return ;
        }
        for(int end=start; end<s.size();end++){
            string str = s.substr(start,end-start+1);
            //if(isHui(s,start,end))
            //{
                if(isHui(s,start,end))
                {
                    cout<<str<<endl;
                    middle.push_back(str);
                    partition2(s,end+1,middle,result);
                    middle.pop_back();
                }
                
                
           // }
            
            //cout<<str<<" ";
            
        }
    }
    void partitionHuiString(vector<vector<string>> &result,string s,int start,int end)
    {
        if(start<end)
        {
            
            vector<string> middle;
            int mid = (start + end)/2;
            partitionHuiString(result,s,start,mid);
            partitionHuiString(result,s,mid+1,end);
            if(isHui(s,start,mid)) middle.push_back(s.substr(start,mid-start+1));
            if(isHui(s,mid+1,end)) middle.push_back(s.substr(mid+1,end-mid));
            result.push_back(middle);
            //middle.push_back("1");
            result.push_back(middle);
        }
        if(start==end)
        {
            vector<string> middle;
            middle.push_back(s.substr(start,1));
            result.push_back(middle);
        }
        
        return;
    }
   // string getsubstrbyIndex(string s,int startIndex,int endIndex)
  //  {
   //     string substr;
   //     for(int i=startIndex;i<=endIndex;i++)
   //     {
    //        substr += s[i];
    //    }
    //    return s;
    //}
    bool isHui(string s,int startIndex,int endIndex)
    {
        //if(startIndex<endIndex)
        //{
            for(int i=startIndex,j=endIndex;i<=j;i++,j--)
        {
            if(s[i]!=s[j])
               return false;
        }
        //}
        
        return true;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值