119、【回溯算法】leetcode ——131. 分割回文串:分割问题(C++版本)

题目描述

在这里插入图片描述
在这里插入图片描述
原题链接:131. 分割回文串

解题思路

本题为分割问题,分割问题类似于组合问题。组合问题是按某一顺序进行遍历,依次选取数组中的元素。而分割问题是按某一顺序进行切割,切割出一个数后,继续递归向下以相同的方式进行切割。不论是切割还是组合,本质上都是选择一个数,然后对于选择的数进行某种判断,判定是否加入结果当中,再继续向下遍历。回退时候,将加入的数弹出。

回文串的特点是对称性,例如abbaabcdcba就是会问串。题中的目标就是将一整个字符串,切割出各个子串,保证子串回文串。因此,就需要从头到尾依次遍历,确定符合条件的所有切割点组合。

例如,aab。切割方案有:"a"、"a"、"b”"aa"、"b"

class Solution {
public:
    vector<string> path;
    vector<vector<string>> res;
    // 判定是否为回文串(关于中心数字对称)
    bool isPalindrome(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()) {
            res.push_back(path);
            return ;
        }
        // 遍历各种情况
        for(int i = startIndex; i <= s.size(); i++) {
            // 判断是否为会问串,若是则切割子串,不是则跳过该情况
            if(isPalindrome(s, startIndex, i)) {
                string str = s.substr(startIndex, i - startIndex + 1);                
                path.push_back(str);                
                backtracking(s, i + 1);         // 更新起始点,向右侧子串进行切割
                path.pop_back();
        }
    }
    vector<vector<string>> partition(string s) {
        backtracking(s, 0);
        return res;
    }
};

参考文章:#131.分割回文串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值