括号的生成(动态规划和递归两种算法来实现)

news/2024/11/23 20:23:19/

题目:

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

示例1:

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

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

解题思路:

 采用动态规划算法:
 1.当i=n时,括号的组合是:
 2."(" + 【i=p时所有括号的排列组合】 + ")" + 【i=q时所有括号的排列组合】
 3.其中p+q=n-1
 4.当p从0遍历到n-1,q从n-1遍历到0后,那么所有情况已经全部遍历过了

vector<string> generateParenthesis(int n) {vector<vector<string>> dp(n+1);//这里要初始化dp的大小为n+1,因为有个dp[0]是空字符串,保证了下标与n是相同的dp[0] = { "" };dp[1] = { "()" };if(n==0||n==1) return dp[n];//当n=0,或n=1时,直接返回dp[n]即可for (int i = 2; i <= n; i++) {for (int j = 0; j <i; j++) {for (string p : dp[j])//这里是c++11的用法,相当于遍历dp[j]中所有的字符串for (string q : dp[i - j - 1]) {string str = "(" + p + ")" + q;dp[i].push_back(str);//每遍历一次,就存放一次结果到dp[i]中}}}return dp[n];}

 采用递归回溯来实现:

1.左括号和右括号的数量不能超过n
2.每放置一个左括号,才可以放置右括号,(右括号不能先于左括号)
递归条件
1.左括号个数要大于右括号个数,才能继续递归

注意:

1.最终结果 vector<string> ret;
2.临时结果 string temp;

void fn(string temp, int left, int right, vector<string>& ret)
{if (left == 0 && right == 0){ret.push_back(temp);return;}if (left > 0)//左括号只要还有存量,就可以放fn(temp + '(', left - 1, right, ret);if (right > left)//左括号剩的比右括号少fn(temp + ')', left, right - 1, ret);}

http://www.ppmy.cn/news/82652.html

相关文章

肝一肝设计模式【九】-- 享元模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…

《汇编语言》- 读书笔记 - 第5章- [BX]和 loop 指令

《汇编语言》- 读书笔记 - 第5章- [BX]和 loop 指令 5.1 [BX]问题 5.1 5.2 Loop 指令任务 1任务 2任务 3程序 5.1问题 5.2问题 5.2 5.3 在 Debug 中跟踪用 loop 指令实现的循环程序5.4 Debug 和汇编编译器 masm 对指令的不同处理DebugMASM 5.5 loop 和[bx]的联合应用程序 5.5问…

可逆计数器vhdl

CLR是复位控制输入端&#xff1b;ENA是使能控制输入端&#xff1b;LOAD是预置控制输入端&#xff1b;D[3..0]是4位并行数据输入端&#xff1b;DIR是加减控制输入端&#xff0c;当DIR0时&#xff0c;计数器作加法操作&#xff0c;DIR1时&#xff0c;计数器作减法操作&#xff1b…

边缘计算盒子功能介绍,为什么要用边缘计算盒子?

边缘计算盒子&#xff08;Edge Computing Box&#xff09;是一种用于边缘计算设备。边缘计算是一种分布式计算模型&#xff0c;它将计算和数据处理能力从传统的集中式云计算数据中心延伸到网络边缘的设备上&#xff0c;以便更快地响应实时数据处理需求和减少对云服务的依赖。 边…

ChatGPT工作提效之小鹅通二次开发批量API对接解决方案(学习记录同步、用户注册同步、权益订购同步、开发文档)

ChatGPT工作提效系列 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式 ChatGPT工作提效之小鹅通二次开发批量API对接解决…

做什么类型的抖音自媒体账号赚钱?

其实有两类账号&#xff0c;大周认为是比较赚钱的&#xff1a; 1、种草类账号 2、测评类账号 但并不是所有人都适合做这种账号赚钱&#xff0c;那还有哪些领域可以选择呢&#xff1f; 今天这期内容大周就来给粉丝们分享一波&#xff0c;抓紧点赞收藏 首先问自己几个问题&a…

使用Vue完成一个户籍管理系统

js <template> <div> <h2>学籍管理系统</h2> <div> 姓名&#xff1a; <input v-model"user.name" /> </div> <div> 年龄&#xff1a; <input v-model"user.age" /> </div> <div> 性别…

effective c++ 53-不要忽略编译器的警告

effective c 53-不要忽略编译器的警告 这一节所讲解的道理是很简单的&#xff0c;主要就是告诉大家要利用好编译器给出的warning信息&#xff0c;不要轻易忽视。但是在日常开发中&#xff0c;很多人都对warnging的警告不太重视。在编程方法中的很多优化方法都是将运行态的错误…