分隔字符串的回溯解法(C++)

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

下面是C++源代码

class Solution{
    public:
        //要求划分后原串的各个部分都是回文,所有先划分一部分应该使用回溯算法,先枚举起点

        vector<string>res;//res容器用来装判断结果

        vector<vector<string>>ans;//ans容器用来装res容器

        void dfs(string &s, int start)//深度优先搜索
        {
            if(start >= s.size())//可以一直划分到最后说明可以划分为字符串
            {
                ans.push_back(res);//加入答案

                return;            
            }   

            for(int i= start;i<s.size();i++){//循环字符串寻找回文串

                if(isPalinddrome(s,start,i))//如果为回文

                {

                    string str = s.substr(start,i-start+1);

                    res.push_back(str);//暂存结果

                    dfs(s,i+1);//继续划分i+1-s.size()-1

                    res.pop_back();//如果不能划分为回文串,就使用回溯 
               
                }            
            }     
        }
        bool isPalinddrome(string &s, int i, int j)//判断是否为回文

        {

            while(i<j){

                if(s[i]==s[j]){//使用双指针,一个指向首,一个指尾,都朝字符串中间遍历

                    i++,j--;}

                else
                	return false;                                        
                }    
                return true;                        
            }        

            vector<vector<string>> partition(string s)

            {
                dfs(s,0);

                return ans;            
            }
        };

解析放在代码中了,如有需要自行修改即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值