🌹作者:云小逸
📝个人主页:云小逸的主页
📝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.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。
最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)
愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!