力扣---括号生成---回溯---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*n
            for i in range(num):
                if temp[i]=='(':
                    s.append(temp[i])
                else:
                    if len(s)==0:
                        return False
                    else:
                        s.pop()
            if len(s)==0:
                return True
            else:
                return False

        
        res=[]
        temp=2*n
        temp_=1<<temp
        for 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;
        }

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

        //将')'加入temp
        temp+=')';
        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*n
            for i in range(num):
                if temp[i]=='(':
                    s.append(temp[i])
                else:
                    if len(s)==0:
                        return False
                    else:
                        s.pop()
            if len(s)==0:
                return True
            else:
                return False

        
        def dfs(i:int,res:List[str],temp:str,n:int):
            if i==2*n:
                if check(temp,n):
                    res.append(temp)
                return
            temp+='('
            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;
        }

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

        //将')'加入temp
        if(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)
                return
            temp+='('
            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
            

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记一次Oracle 19C RAC 在线更换数据盘和OCR盘操作记录

欢迎您关注我的公众号【尚雷的驿站】 **************************************************************************** 公众号&#xff1a;尚雷的驿站 CSDN &#xff1a;https://blog.csdn.net/shlei5580 墨天轮&#xff1a;https://www.modb.pro/u/2436 PGFans&#xff1a;ht…

华为ensp中rip动态路由协议原理及配置命令(详解)

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言————— RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种距离矢…

【Java】Oracle发布Java22最新版本

甲骨文&#xff08;ORACLE&#xff09;已经于2023年3月19日正式发布了最新版本的JDK&#xff0c;版本号&#xff1a;22 根据官方声明&#xff0c;Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进&#xff0c;包括对Java 语言、其API 和性能&#xff0c;以…

raid规划配置

一 raid基本知识 1、RAID磁盘阵列概述 磁盘阵列的全名&#xff08;Redundant Arrays of Inexpensive Disk&#xff0c;RAID&#xff09;&#xff0c;中文简称是独立冗余磁盘阵列。 RAID可以通过技术&#xff08;软件或者硬件&#xff09;将多个独立的物理硬盘整合成为一个较大…

探索山海鲸可视化:相较于Excel的独特优势分析

作为一名新用户&#xff0c;我近期开始接触并尝试使用山海鲸可视化工具&#xff0c;这款软件最初吸引我的点在其免费可视化编辑、本地化部署的特点&#xff0c;用了一段时间后&#xff0c;我发现相较于之前使用的Excel来制作可视化看板&#xff0c;两者在多个方面有着显著的区别…

electron-builder允许安装时请求提升权限

场景 在下面的场景中可能会需要管理员权限&#xff1a; electron开发的软件具有文件操作功能&#xff0c;如果electron安装到C盘&#xff0c;并操作项目中&#xff08;C盘&#xff09;的文件&#xff0c;就会因权限不足报错。electron需要操作注册表等系统级关键配置某些命令…

浅尝大菠萝Pinia

1、pinia简介 Pinia&#xff08;发音为 /piːnjʌ/&#xff0c;类似于英语中的“peenya”&#xff09;是最接近有效包名 pia&#xff08;西班牙语中的_pineapple_&#xff09;的词。 Pinia 是由 Vue.js 团队成员开发&#xff0c;新一代的状态管理器&#xff0c;即 Vuex5.x。 …

Godot 学习笔记(2):信号深入讲解

文章目录 前言相关链接环境信号简单项目搭建默认的信号先在label里面预制接收函数添加信号 自定义无参数信号为了做区分&#xff0c;我们在label新增一个函数 自定义带参数信号Button代码label代码连接信号 自定义复杂参数信号自定义GodotObject类ButtonLabel连接信号 父传子Ca…

如何查看zip文件的MD5码

目录 Windows macOS 和 Linux 要查看zip文件的MD5码&#xff0c;你可以使用不同的方法&#xff0c;具体取决于你使用的操作系统。以下是一些常见平台的指导&#xff1a; Windows 可以使用PowerShell来计算文件的MD5码。打开PowerShell&#xff0c;然后使用以下命令&#xf…

wireshark 使用实践

1、打开wireshark软件&#xff0c;选择网卡&#xff0c;开始抓包 2、打开浏览器&#xff0c;访问一个http网站&#xff1a;这里我用 【邵武市博物馆】明弘治十一年&#xff08;1498&#xff09;铜钟_文物资源_福建省文 测试&#xff0c;因为它是http的不是https&#xff0c;方…

基于深度学习的场景文本检测

CTPN 简介&#xff1a; 基于目标检测方法的文本检测模型&#xff0c;在Faster RCNN的基础上进行了改进&#xff0c;并结合双向LSTM增强了序列提取特征&#xff0c;通过anchor和gt的设计将文本检测任务转化为一连串小尺度文本框的检测。 解决问题&#xff1a; 文本长短不一&…

jenkins gradle 编译时jvm不足情况

gradle 编译时jvm不足情况 #开启线程守护&#xff0c;第一次编译时开线程&#xff0c;之后就不会再开了org.gradle.daemontrue#配置编译时的虚拟机大小org.gradle.jvmargs-Xmx2048m -XX:MaxPermSize512m -XX:HeapDumpOnOutOfMemoryError -Dfile.encodingUTF-8#开启并行编译&…

JL15-400/11过电流继电器 400A 一开一闭 380V 柜内安装JOSEF约瑟

系列型号 JL15-1.5/11电流继电器JL15-2.5/11电流继电器 JL15-5/11电流继电器JL15-10/11电流继电器 JL15-15/11电流继电器JL15-20/11电流继电器 JL15-30/11电流继电器JL15-40/11电流继电器 JL15-60/11电流继电器JL15-80/11电流继电器 JL15-100/11电流继电器JL15-150/11电流…

顺序表的动态分配基本操作

#include <stdio.h> #include <stdlib.h>// 顺序表存储空间动态分配 #define InitSize 10 // 顺序表初始长度 typedef int ElemType; // int类型重命名为ElemType&#xff0c;方便后续调整typedef struct { // 定义结构体ElemType *data; // 用静…

LeetCode 刷题 --- 快速幂

前言&#xff1a; 幂运算是一种常见的运算&#xff0c;求取a^n,最容易想到的方法便是通过循环逐个累乘&#xff0c;其复杂度为O(n)&#xff0c;这在很多时候是不够快的&#xff0c;所以我们需要一种算法来优化幂运算的过程。 快速幂&#xff0c;二进制取幂&#xff08;Binary…

Transformer的前世今生 day03(Word2Vec、如何使用在下游任务中)

前情回顾 由上一节&#xff0c;我们可以得到&#xff1a; 任何一个独热编码的词都可以通过Q矩阵得到一个词向量&#xff0c;而词向量有两个优点&#xff1a; 可以改变输入的维度&#xff08;原来是很大的独热编码&#xff0c;但是我们经过一个Q矩阵后&#xff0c;维度就可以控…

express+mysql+vue,从零搭建一个商城管理系统16--收货地址(全国省市县名称和code列表)

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建config/area.js二、新建models/address.js三、新建dao/address.js四、新建routes/address.js五、添加地址六、查询用户地址列表总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写serv…

ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY

论文题目&#xff1a; ANOMALY TRANSFORMER: TIME SERIES ANOMALY DETECTION WITH ASSOCIATION DISCREPANCY 发表会议&#xff1a;ICLR 2022 论文地址&#xff1a;https://openreview.net/pdf?idLzQQ89U1qm_ 论文代码&#xff1a;https://github.com/thuml/Anomaly-Transforme…

七、Java中SpringBoot组件集成接入【Minio文件服务器】

七、Java中SpringBoot组件集成接入【Minio文件服务器】 1.Minio介绍2.搭建Minio服务2.1Windows部署2.2Linux部署2.3docker部署 3.Minio可视化操作4.SpringBoot接入Minio1.添加maven依赖2.yaml配置文件3.配置类4.工具类5.控制类 5.常见问题6.其他参考文章 1.Minio介绍 对象存储…

设计模式深度解析:适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼 探索设计模式的魅力&#xff1a;深入了…