LeetCode_131刷题笔记

1原题目
LeetCode_131
2 题目大意
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。
3.题目分析
在这里插入图片描述
4基础知识
回溯算法
 4.1C的语法
 4.2数据结构
 4.3算法
回溯算法(解法1)
这里用到了DFS解决问题的思路, 同样这样的找出所有的可能性,我们使用了递归的思想。这里首先有一个辅助的函数 用于判断一个字符串是否是回文。然后在find_results中去找所有的可能性。应该明白在每一步都可以判断中间结果是否为合法结果,这里我们采用了回溯法
5解法
解法1:

class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>> results;
        vector<string> path;
        if (s.empty()) return results;
        int begin = 0;
        find_results(s, path, results, 0);
        return results;
    }

    void find_results(string s, vector<string>& path, vector<vector<string>>& results, int begin) {
        // 如果begin已经到了size位置,则代表这次的寻找已经到头了,将结果压入results中,然后return 
        if (begin == s.size()) {
            results.push_back(path);
            return;
        }
        // 这里的循环是从begin开始 , 一直到结束
        for (int i = begin; i < s.size(); ++i) {
            // 首先判断, begin 到i是否为回文
            if (is_par(s, begin, i)) {
                // 如果是则将结果压入到path中
                path.push_back(s.substr(begin, i - begin + 1));
                // 再次从i+1的位置递归
                find_results(s, path, results, i + 1);
                // 找完之后回溯,把这个path弹出来
                path.pop_back();
            }
        }
    }

    bool is_par(const string& s, int begin, int end) {
        while (begin <= end && s[begin] == s[end]) {
            begin++;
            end--;
        }
        return begin >= end;
    }
};

6.总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值