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

news2024/9/25 15:29:04

暴力--二进制

采用与:力扣---子集---回溯(子集型回溯)---递归-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
            

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

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

相关文章

HTTP系列之HTTP缓存 —— 强缓存和协商缓存

文章目录 HTTP缓存强缓存协商缓存状态码区别缓存优先级如何设置强缓存和协商缓存使用场景 HTTP缓存 HTTP缓存时利用HTTP响应头将所请求的资源在浏览器进行缓存&#xff0c;缓存方式分两种&#xff1a;强缓存和协商缓存。 浏览器缓存是指将之前请求过的资源在浏览器进行缓存&am…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(日历选择器弹窗)

点击日期弹出日历选择器弹窗&#xff0c;可选择弹窗内任意日期。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

第3章 数据治理

思维导图 数据治理的定义&#xff1a;是在管理数据资产过程中行使权力和管控&#xff0c;包括计划、监控、和实施。 职能&#xff1a;指导所有其他数据管理领域的活动。目的&#xff1a;确保根据数据管理制度和最佳实践正确地管理数据。整体驱动力&#xff1a;确保组织可以从其…

hashmap专题

hashmap专题 常见maphashMapjdk1.8HashMap新变化hashmap源码中重要的常量存储结构put 存入数据过程取数据过程get()扩容hashmap 树化/链化hashmap的容量 桶的数量为什么要是2的n次方&#xff1f;hashmap为什么线程不安全 常见map hashtable线程安全&#xff0c;但效率太低。ha…

《深入Linux内核架构》第2章 进程管理和调度 (6)

目录 2.8 调度器增强 2.8.1 SMP调度 2.8.2 调度域和控制组 2.8.3 内核抢占和低延迟相关工作 2.9 小结 2.8 调度器增强 2.8.1 SMP调度 进程迁移&#xff1a; 含义&#xff1a;把进程从一个CPU就绪队列迁移至另一个CPU就绪队列。 作用&#xff1a;CPU负荷均衡。 缺点&…

【评分标准】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷 无线网络勘测设计

第一部分&#xff1a;无线网络勘测设计评分标准 序号评分项评分细项评分点说明评分方式分值1点位设计图AP编号AP编号符合“AP型号位置编号”完全匹配5AP型号独立办公室、小型会议室选用WALL AP110完全匹配5员工寝室选用智分&#xff0c;其他用放装完全匹配5其它区域选用放装AP…

【原创】JDK17获取CPU占用率、内存占用率以及堆内存使用情况

前言 我之前一篇文章&#xff1a; 【原创】Java获取CPU占用率、内存占用率最简单的方式_java获取cpu使用率-CSDN博客 这篇文章虽然简单&#xff0c;但是只能针对JDK8&#xff0c;换成现在模块化的JDK后&#xff0c;OperatingSystemMXBean类就无法反射获取其中的信息了&#…

代码随想录 动态规划-股票问题

目录 121.买卖股票的最佳时机 122买卖股票的最佳时机II 123. 买卖股票的最佳时机III 188.买卖股票的最佳时机IV 309.买卖股票的最佳时机含冷冻期 714.买卖股票的最佳时机含手续费 121.买卖股票的最佳时机 121. 买卖股票的最佳时机 简单 给定一个数组 prices &…

【FLOOD FILL专题】【蓝桥杯备考训练】:扫雷、动态网格、走迷宫、画图、山峰和山谷【已更新完成】

目录 1、扫雷&#xff08;Google Kickstart2014 Round C Problem A&#xff09; 2、动态网格&#xff08;Google Kickstart2015 Round D Problem A&#xff09; 3、走迷宫&#xff08;模板&#xff09; 4、画图&#xff08;第六次CCF计算机软件能力认证&#xff09; 5、山…

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中&#xff0c;应用性能监控&#xff08;Application Performance Monitoring, APM&#xff09;扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking&#xff0c;通过对其功能特性和工作原理的详细介绍&am…

cocos(困扰了我一晚上的代码)地图适配不同手机屏幕

Creator 版本&#xff1a;3.8.2 目标平台&#xff1a; 微信小游戏 有人反馈我的小游戏没有做屏幕适配。其实我是做了的。但是在不同手机分辨率的情况下。 适配出了问题。然后我改了一晚上的代码终于做好了。 设计的分辨率是960*640.也就是白色区域。 但是大部分手机是…

2024全国水科技大会:【协办单位】山东文远环保科技股份有限公司

山东文远环保科技股份有限公司坐落于千年古城齐国故都--临淄。初始成立于2011年&#xff0c;是淄博市首批国有资本参股的混合改制企业。 公司着力打造环保设备制造、环保工程及服务、环保水务/固废处理/新能源项目投资及运营管理、固废循环经济产业园等四大板块。是一家集投资、…

【spring】@Conditional注解学习

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

【网络原理】HTTP 请求 (Request)详解

文章目录 &#x1f38d;请求格式&#x1f384;认识URL&#x1f338;query string&#x1f338;关于 URL encode &#x1f340;认识 “方法” (method)&#x1f338;GET方法&#x1f338;POST 方法&#x1f338;GET 和 POST 的区别 &#x1f332;认识请求 “报头” (header)&…

cocos控制物体移动轨迹

引擎&#xff1a;CocosCreator 3.8.2 思考了很久决定要不要发这票文章。因为毕竟我也是一个新手。但是这个问题真的困扰了我很久。 特意分享给大家。 如图所示有2个方块。他们可以跟着轨迹移动。 这个轨迹箱子总体来说有以下几个规则。 1.只能沿着轨迹移动。 2.上面只能有一…

[ C++ ] STL---string类的模拟实现

目录 string类的成员变量 构造函数 有参构造函数 无参构造函数 析构函数 拷贝构造函数 赋值运算符重载 string类对象的容量操作 string类对象的遍历与访问 [ ] 下标遍历 迭代器遍历 string类对象的增删查改 string类的成员变量 string类底层为动态开辟的字符数组&a…

提升水库大坝安全与效率:现代技术云平台的应用

在我国&#xff0c;水库大坝的数量居世界之首&#xff0c;它们在推动国民经济发展中扮演着不可或缺的角色。然而&#xff0c;要想让这些水利工程充分发挥其价值&#xff0c;不仅需要精准的调度与高效的管理&#xff0c;更重要的是要确保其安全无虞。一旦发生事故&#xff0c;后…

【机器学习】基于变色龙算法优化的BP神经网络分类预测(SSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】变色龙优化算法&#xff08;CSA)原理及实现 2.设计与实现 数据集&#xff1a; 数据集样本总数2000 多输入多输出&#xff1a;样本特征24&#xff…

Java中的I/O讲解(超容易理解)(上篇)

如果想观看更多Java内容 可上我的个人主页关注我&#xff0c;地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?spm1000.2115.3001.5343使用工具 IntelliJ IDEA Community Edition 2023.1.4 使用语言 Java8 代码能力快速提升小方法&#xff0c;看完代码自己敲一…

智慧乡村赋能发展:数字乡村推动农村经济社会持续繁荣

目录 一、智慧乡村的内涵与发展意义 二、智慧乡村赋能发展的路径 1、加强信息基础设施建设 2、推进农业生产智能化 3、提升乡村治理现代化水平 4、推动农村产业融合发展 三、智慧乡村发展面临的挑战与对策 四、智慧乡村发展的未来展望 1、技术融合创新将更加深入 2、…