LeetCode第21题之Generate Parentheses(两种解法)

2024-06-20 15:18

本文主要是介绍LeetCode第21题之Generate Parentheses(两种解法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++代码:
解法一(在LeetCode上运行效率高于解法二):

#include <vector>
#include <iostream>
#include <string>
using namespace std;class Solution {
private:vector<string> res;
public: //leftRemain保存还可以放左括号的数目,rightRemain保存还可以放右括号的数目void dfs(string state, int leftRemain, int rightRemain){//这种情况括号不匹配if (leftRemain > rightRemain){return;}if (0 == leftRemain && 0 == rightRemain){res.push_back(state);return;}if (leftRemain > 0){dfs(state + "(", leftRemain -1, rightRemain);}if (rightRemain >0 ){dfs(state + ")", leftRemain, rightRemain-1);}}vector<string> generateParenthesis(int n) {dfs("",n,n);return res;}
};int main()
{Solution s;vector<string> r = s.generateParenthesis(3);for (vector<string>::iterator it = r.begin();it != r.end();++it){cout<<*it<<endl;}return 0;
}

解法二:

#include <vector>
#include <iostream>
#include <string>
using namespace std;class Solution {
private://保存结果vector<string> res;
public:void fun(int deep, int n, int leftNum, int leftTotalNum, string s){//如果左括号的总数大于n,则该字符串不可能满足要求if (leftTotalNum  > n){return;}//如果到达最底层,则s一定满足题意。因为运行到这里时,leftTotalNum<=n,而leftNum>=0if (n*2 == deep){res.push_back(s);return;}for (int i=0;i<2;++i){if (0 == i){//在deep+1的位置放左括号fun(deep+1, n, leftNum+1, leftTotalNum+1, s + "(");}else{//如果有剩余未匹配的左括号数,才能放右括号if (leftNum > 0){fun(deep+1, n, leftNum-1, leftTotalNum, s + ")");}}}}vector<string> generateParenthesis(int n) {//剩余未匹配的左括号数int leftNum = 0;//字符串中左括号总数int leftTotalNum =0;string s = "";fun(0, n, leftNum, leftTotalNum, s);return res;}
};int main()
{Solution s;vector<string> r = s.generateParenthesis(3);for (vector<string>::iterator it = r.begin();it != r.end();++it){cout<<*it<<endl;}return 0;
}

这篇关于LeetCode第21题之Generate Parentheses(两种解法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078495

相关文章

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用