【基础算法】括号生成问题

243 阅读2分钟

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟 👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

@TOC


前言

今天我们继续学习算法,加油。这篇文章写的是## 括号生成问题。希望这篇可以有幸帮助到你,码字不易,请多多支持。 在这里插入图片描述


当然!以下是使用Markdown格式的题目和C++代码解法:

22. 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。

示例 1:

输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1 输出:["()"]

提示:

  • 1 <= n <= 8

解题思路如下:

这个解法使用了递归回溯的方法来生成所有可能的有效括号组合。

首先,定义了一个辅助函数 valid,用于检查一个字符串是否是有效的括号组合。在函数内部,使用一个变量 balance 来记录左括号和右括号的平衡情况。遍历字符串中的每个字符,如果是左括号则增加 balance,如果是右括号则减少 balance。在任何时候,如果 balance 小于 0,说明右括号的数量超过了左括号,即不是有效的括号组合,直接返回 false。最后,检查 balance 是否为 0,即左括号和右括号数量相等,表示有效的括号组合,返回 true

接下来,定义了另一个辅助函数 generate_all,它接受当前的字符串 current、目标括号对数 n 和结果集 result。在函数内部,首先判断当前字符串的长度是否达到了目标长度 n,如果是,则检查当前字符串是否是有效的括号组合,如果是,则将其加入结果集。然后,分别尝试添加左括号和右括号,递归调用 generate_all 函数,继续生成下一个字符,直到所有可能的情况都考虑完毕。

最后,在主函数 generateParenthesis 中,创建一个空的字符串 current,调用 generate_all 函数,传入 n * 2 作为目标括号对数,将结果存储在结果集 result 中,最后返回结果集。

通过递归回溯的方法,生成了所有可能的有效括号组合。

解法

class Solution {
    bool valid(const string& str) {
        int balance = 0;
        for (char c : str) {
            if (c == '(') {
                ++balance;
            } else {
                --balance;
            }
            if (balance < 0) {
                return false;
            }
        }
        return balance == 0;
    }

    void generate_all(string& current, int n, vector<string>& result) {
        if (n == current.size()) {
            if (valid(current)) {
                result.push_back(current);
            }
            return;
        }
        current += '(';
        generate_all(current, n, result);
        current.pop_back();
        current += ')';
        generate_all(current, n, result);
        current.pop_back();
    }
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        string current;
        generate_all(current, n * 2, result);
        return result;
    }
};

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.把时间尺度拉长,拉长十年看当下

2.不说负面情绪,只描述事实;

3.越专注于过好自己,能量和幸运越会照顾你; 只解决问题,不做没有意义的担心,输了就认;

4.学会原谅自己,要允许自己做错事,允许自己出现情绪波动,我知道你已经很努力很努力在做好了

5.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!