力扣---括号生成---回溯---dfs/二进制

暴力--二进制

采用与:力扣---子集---回溯(子集型回溯)---递归-CSDN博客 中二进制求解一样的思路,即遍历0~2^{2\cdot n}-1(从二进制去考虑),如果这个数的第 i 位为0,则括号的第 i 位为‘( ’,为1代表‘ )’。依次求出所有括号的可能性(总共2^{2\cdot n}种可能),再对每种情况进行判别。

代码:

C++:

class Solution {
public:bool check(string temp,int n){stack<char> s;int num=2*n;for(int i=0;i<num;i++){//先判断是否配对if(temp[i]=='('){s.push(temp[i]);}else{if(s.empty()){return false;}else{s.pop();}}}if(s.empty()){return true;}else{return false;}}vector<string> generateParenthesis(int n) {vector<string> res;int temp=2*n;for(int i=0;i<(1<<temp);i++){ //0代表(,1代表)string s;for(int j=0;j<temp;j++){if(i & (1<<j)){s+=')';}else{s+='(';}}//cout<<s<<endl;if(check(s,n)){res.push_back(s);}}return res;}
};

Python:

class Solution:def generateParenthesis(self, n: int) -> List[str]:def check(temp:str,n:int) -> bool:s=deque()num=2*nfor i in range(num):if temp[i]=='(':s.append(temp[i])else:if len(s)==0:return Falseelse:s.pop()if len(s)==0:return Trueelse:return Falseres=[]temp=2*ntemp_=1<<tempfor i in range(temp_):s=""for j in range(temp):if i & (1<<j):s+=')'else:s+='('if check(s,n):res.append(s)return res

注意:len(s)用于查看队列/栈中元素的个数,string在Python中的写法为str,Python中栈和队列都可以用deque来实现。deque:from collections import deque 

暴力--回溯dfs

采用与:力扣---子集---回溯(子集型回溯)---递归-CSDN博客 中递归法一样的思路,分为三个步骤,第一步骤为特殊情况的判别,即2\cdot n个位置已经填满,对其进行判别。第二步骤为第 i 为设置为‘(’,进行递归调用(注意保护现场)。第三步骤为第 i 为设置为‘ )’,进行递归调用(注意保护现场)。

代码:

C++:

class Solution {
public:bool check(string temp,int n){stack<char> s;int num=2*n;for(int i=0;i<num;i++){//先判断是否配对if(temp[i]=='('){s.push(temp[i]);}else{if(s.empty()){return false;}else{s.pop();}}}if(s.empty()){return true;}else{return false;}}void dfs(int i,vector<string>& res,string temp,int n){if(i==2*n){if(check(temp,n)){res.push_back(temp);}return;}//将'('加入temptemp+='(';dfs(i+1,res,temp,n);temp.pop_back();//将')'加入temptemp+=')';dfs(i+1,res,temp,n);temp.pop_back();}vector<string> generateParenthesis(int n) {vector<string> res;string temp;dfs(0,res,temp,n);return res;}
};

Python:

 

class Solution:def generateParenthesis(self, n: int) -> List[str]:def check(temp:str,n:int) -> bool:s=deque()num=2*nfor i in range(num):if temp[i]=='(':s.append(temp[i])else:if len(s)==0:return Falseelse:s.pop()if len(s)==0:return Trueelse:return Falsedef dfs(i:int,res:List[str],temp:str,n:int):if i==2*n:if check(temp,n):res.append(temp)returntemp+='('dfs(i+1,res,temp,n)temp=temp[0:len(temp)-1]temp+=')'dfs(i+1,res,temp,n)temp=temp[0:len(temp)-1]res=[]temp=""dfs(0,res,temp,n)return res

对第二种写法的优化:

 我们需要认识到一个点,遍历到第 i 位(即要确定第 i 位是左括号还是右括号时),前 i-1 位的左括号数量一定大于右括号的数量,第 i 位才可能是‘ )’。所以我们可以在这部分进行改进:

//将')'加入temp
temp+=')';
dfs(i+1,res,temp,n);
temp.pop_back();

同时,对特殊情况的判断也可以变为对左括号数量和对右括号数量的判断。

代码:

C++:

class Solution {
public://左括号数>右括号数,才能加右括号void dfs(int i,vector<string>& res,string temp,int n,int left,int right){if(i==2*n){if(left==right){res.push_back(temp);}return;}//将'('加入temptemp+='(';dfs(i+1,res,temp,n,left+1,right);temp.pop_back();//将')'加入tempif(left>right){temp+=')';dfs(i+1,res,temp,n,left,right+1);temp.pop_back();}}vector<string> generateParenthesis(int n) {vector<string> res;string temp;dfs(0,res,temp,n,0,0);return res;}
};

Python:

class Solution:def generateParenthesis(self, n: int) -> List[str]:def dfs(i:int,res:List[str],temp:str,n:int,left:int,right:int):if i==2*n:if left==right:res.append(temp)returntemp+='('dfs(i+1,res,temp,n,left+1,right)temp=temp[0:len(temp)-1]if left>right:temp+=')'dfs(i+1,res,temp,n,left,right+1)temp=temp[0:len(temp)-1]res=[]temp=""dfs(0,res,temp,n,0,0)return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel第27享:基于if函数嵌套的多结果唯一性匹配

1、需求描述 如下图所示&#xff0c;现在有E列、F列、G列三列数据&#xff0c;在D列中填充“最终对应编号”&#xff0c;匹配原则是&#xff1a;E列、F列、G列三列数据中&#xff0c;哪个有数据就填充哪个数据&#xff0c;如果都没有&#xff0c;就显示空值即可。 2、解决思路…

windows使用知识

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言windows使用知识 一、cmd鼠标选中后&#xff0c;程序不运行的解决方案总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; windows使用…

前端学习资源整合

整合优质前端学习资源和文章&#xff0c;不定期更新。 JavaScript 现代 JavaScript 教程 官网&#xff1a;https://zh.javascript.info/GitHub&#xff1a;https://github.com/javascript-tutorial/zh.javascript.info 优秀的JS代码规范 官方英文版&#xff1a;https://gi…

二刷代码随想录——动态规划day53

文章目录 前言动态规知识点 动规五部曲一、1143. 最长公共子序列二、1035. 不相交的线三、53. 最大子数组和总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加…

SpringCloud面试题以及答案

1、SpringCloud是什么&#xff1f; 1、 Spring Cloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用SpringBoot的…

redis 常见的异常

目录 一、缓存穿透 1、概念 解决方案 &#xff08;1&#xff09;布隆过滤器 (2)、缓存空对象 二、缓存雪崩 1、概念 解决方案 &#xff08;1&#xff09;redis高可用 &#xff08;2&#xff09;限流降级 &#xff08;3&#xff09;数据预热 一、缓存穿透 1、概念 缓…

【Greenhills】GHS-MULTI IDE-Ubuntu纯命令系统部署license文件

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 记录在Ubuntu纯命令系统中部署license文件的步骤。 2、 问题场景 客户服务器为Linux纯命令行的环境&#xff0c;客户也无其他服务器可以部署&#xff0c;需在纯命令行上尝试安装。 3、软硬件环境 1&#xff09…

Windows系统部署eXtplorer文件管理器结合内网穿透构建私人云存储服务器

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

8.测试教程-自动化测试selenium-3

文章目录 1.unittest框架解析2.批量执行脚本2.1构建测试套件2.2用例的执行顺序2.3忽略用例执行 3.unittest断言4.HTML报告生成5.异常捕捉与错误截图6.数据驱动 大家好&#xff0c;我是晓星航。今天为大家带来的是 自动化测试selenium第三节 相关的讲解&#xff01;&#x1f600…

镜像站汇总

软件镜像站 查看linux版本&#xff0c;常见有centos, ubuntu, Debian cat /etc/os-release去清华软件源帮助页面&#xff0c;查找对应源设置方案(需要结合具体的系统版本)&#xff0c;常用&#xff1a; Debian https://mirrors.tuna.tsinghua.edu.cn/help/debian/ 需要选则系…

ISIS邻居以及路由计算

ISIS报文细节&#xff0c;ISIS报文分为三个部分&#xff1a; 1、通用报文头 Intradomain Routeing Pro Dis&#xff1a;ISIS&#xff1a;域内路由协议鉴别符&#xff1a;0x83代表ISIS协议 Length Indicator&#xff1a;27 头部长度&#xff08;包含了通用头部和专用头部&…

【原创】三十分钟实时数据可视化网站前后端教程 Scrapy + Django + React 保姆级教程向

这个本来是想做视频的&#xff0c;所以是以讲稿的形式写的。最后没做视频&#xff0c;但是觉得这篇文还是值得记录一下。真的要多记录&#xff0c;不然一些不常用的东西即使做过几个月又有点陌生了。 文章目录 爬虫 SCRAPYxpath 后端 DJANGO前端 REACT Hello大家好这里是小鱼&a…

掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)

通道&#xff08;Channel&#xff09;是用来在 Go 程序中传递数据的一种数据结构。它是一种类型安全的、并发安全的、阻塞式的数据传输方式&#xff0c;用于在不同的 Go 协程之间传递消息。 基本概念 创建通道&#xff1a;使用make()函数创建一个通道。 ch : make(chan int)…

【spring】@Conditional注解学习

Conditional介绍 Conditional注解用于按照设定的条件进行判断&#xff0c;从而决定是否将某个bean注册到Spring容器中。 Conditional注解是在Spring 4.0版本中引入的&#xff0c;它提供了一种更加灵活的方式来控制bean的创建和注册。在此之前&#xff0c;开发者通常使用Profi…

Automated and Cooperative Vehicle Merging at Highway On-Ramps

论文解读——Automated and Cooperative Vehicle Merging at Highway On-Ramps 参考资料来源&#xff1a;《Automated and Cooperative Vehicle Merging at Highway On-Ramps》一文 1.问题描述 该文章想解决如FIG.1中的匝道合流问题&#xff0c;传统的匝道合理需要等待main r…

vue@2.7.16 使用less、less-loader

遇到问题&#xff0c;npm install less-loader7.3.0 --save安装好less-loader后&#xff0c;执行npm run serve 项目运行不起来&#xff0c;排查后发现在安装less-loader后就提示需要安装less&#xff0c;正确的安装应如下&#xff1a; npm install less less-loader7.3.0 --sa…

物联网应用技术中的stm32该怎么学,该从哪入手?

物联网应用技术中的stm32该怎么学&#xff0c;该从哪入手&#xff1f; STM32是只物联网中的一部分&#xff0c;单纯的学个STM32是没法满足物联网开发需求的&#xff0c;实际产品开发过程中会考虑成本等多种因素选择合适的方案&#xff0c;比如使用单片机还是stm32或是更高端的芯…

前端vue实现甘特图

1 什么是甘特图 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名&#xff0c;是项目管理、生产排程、节点管理中非常常见的一个功能。 甘特图内在思想简单&#xff0c;即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的…

將SqlServer表創建到hive腳本

將SqlServer表創建到hive腳本 sqlserver.java import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern;public class sqlserver {private static String[] deleteArrayNull(String string[]) {ArrayList<String> strList new A…

考研数学|《660》题这样刷,效率最高!

首先要了解一下660的难度&#xff0c;我认为660的难度是在基础和强化之间的一本习题册。具有一些比较好的选填题目&#xff0c;有些题目可能对初学者来说较为困难&#xff0c;尤其是一些包含二级结论的一些题目。但是对于强化阶段来说&#xff0c;这本题目可能难度较低了一些。…