首页 > 其他分享 >20. 有效的括号

20. 有效的括号

时间:2023-10-25 11:56:40浏览次数:41  
标签:20 return 有效 stk 括号 false true empty

1.题目介绍

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:
输入:s = "()"
输出:true

示例 2:
输入:s = "()[]{}"
输出:true

示例 3:
输入:s = "(]"
输出:false

提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

2.题解(栈的使用)

利用栈先进后出(FILO)的特点,通过入栈,出栈的操作很好的实现括号的匹配

2.1 初解

//
// Created by trmbh on 2023-10-25.
// 20. 有效的括号
//
#include <iostream>
#include <string>
#include <stack>
class Solution {
public:
    bool compare(char c1, char c2){
        if (c1 == '(' && c2 == ')') return true;
        if (c1 == '{' && c2 == '}') return true;
        if (c1 == '[' && c2 == ']') return true;
        return false;
    }
    bool isValid(std::string s) {
        std::stack<char> st;
        for (char c:s){
            if(c == '(' || c == '{' || c == '[')
                st.push(c);
            else if (st.empty()) return false;
            else if (compare(st.top(),c)) st.pop();
            else return false;
        }
        if (st.empty()) return true;
        else return false;
    }
};

int main(){
    Solution solution;
    std::string str = "()[]{}";
    bool res = solution.isValid(str);
    if (res) std::cout<<"匹配成功";
    else std::cout<<"匹配失败";
}

2.2 优化

1. 括号匹配字符串必是偶数个字符

2. 利用键值对映射进行匹配

3. 结尾处直接return stk.empty();即可,不需要使用if判断

class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2 != 0 || s.empty()) return false;
        stack<char> stk;
        unordered_map<char,char> pairs ={
            {')','('},
            {']','['},
            {'}','{'}
        };
        for (char ch:s){
            if(pairs.count(ch)){
                if (stk.empty() || stk.top() != pairs[ch])
                    return false; 
                stk.pop();
            }
            else{
                stk.push(ch);
            } 
        }
        return stk.empty();
    }
};

标签:20,return,有效,stk,括号,false,true,empty
From: https://www.cnblogs.com/trmbh12/p/17786796.html

相关文章

  • ”向前“ CSP2023总结
    CSP2023结束了。我人生中第一场,也是最后一场CSP-S也从此落幕。曾想过很多自己的结局。从挂初赛,过不了复赛,到打不了NOIP。2022,哀其不幸怒其不争。今年走到了NOIP,而且女赛。好好努力吧。前面的比赛,压线过。而NOIP,需要突破。激进的态度就是竞赛本身。......
  • 从每个文件夹中复制20个文件到新的文件夹中
    情况:有个A文件夹,里面有几十个文件夹,每个文件中又有几千中图片,现在想从每个文件夹中提取20个图片作为测试集,复制到B文件夹中,B文件夹中的结构和A相同,B中也是有几十个文件夹,每个文件夹中有20张图片 操作:第一步,在B中创建和A中一样的文件夹lsA|xargs-i-tmakdirB/{}第二......
  • Meta Hacker Cup 2023 Round 1 题解
    ProblemA:HereComesSantaClaus给一个数列,要求分成若干组,要求每组至少2个数,使得所有组中位数的最大值与最小值之差尽量大,求这个值。#include<bits/stdc++.h>usingnamespacestd;#defineFor(i,n)for(inti=1;i<=n;i++)#defineFork(i,k,n)for(inti=k;i<=n;i++)#define......
  • 在Java中,如果一个日期是字符串类型的"2023-01",怎样获取前一个月
    在Java中,如果一个日期是字符串类型的"2023-01",你可以使用java.time包中的类来处理日期。以下是一个示例代码,演示如何获取前一个月的字符串类型的月份:importjava.time.LocalDate;importjava.time.format.DateTimeFormatter;publicclassMain{publicstaticvoidmain(St......
  • centos7安装Docker(2023/10/24)
    centos7安装Docker(2023/10/24)一、安装前必读系统配置方面,这里使用的是Centos7Linux内核:官方建议3.10以上。注意:本文的命令使用的是root用户登录执行,非root用户所有命令前面要加sudo1.查看当前的内核版本1uname-r如图为3.10,满足条件。 2.使用root权限更......
  • 确认(有效性)测试是什么?为什么需要呢?
    ​ 确认测试1、确认测试又称有效性测试。是对通过组合测试的软件(这些软件已经存于系统目标设备的介质上)进行测试,验证软件的功能、性能及其它特性是否与用户的要求一致。 2、确认测试的目的是要表明软件是可以工作的。测试人员通过执行黑盒测试方法,对处在模拟用户环境下的......
  • P2150 [NOI2015] 寿司晚宴
    写了两天。。。就是说,状态压缩DP可以不用显示写出考虑到第i个数,直接每次考虑加入一个数会对当前状态造成的影响即可。这道题发现了大质因数只有1个之后,就需要考虑有相同的大质因数之间的转移,和大质因数不同的之间的转移。然后会发现没有大质因数的数需要特殊处理……然后就好......
  • ruby实战手册(20)
    目录yieldyieldirb(main):001:1*defhello_worldirb(main):002:1*puts"hello"irb(main):003:1*yieldirb(main):004:1*yieldirb(main):005:1*puts"world!"irb(main):006:0>end=>:hello_worldirb(main):007:0>hello_worl......
  • 2023平台工程崭露头角,AI 带来新机遇与挑战
    在今年,平台工程正在迅速在IT企业中崭露头角,成为软件开发团队的必要实践。根据CloudBees发布的最新报告《2023年平台工程:快速采纳和影响》,83%的受访者已经完全实施了平台工程,或正处于某种实施阶段。 平台工程是一门设计和构建内部开发者平台(IDP)、工具链和工作流程的学科,它为......
  • 2023年值得使用的 Node.js 框架
    2023年值得使用的Node.js框架Hacker2022-05-2623,542阅读10分钟 专栏: 前端随记 Node.js是最受欢迎的JavaScript运行时,今天就来看看有哪些热门、值得使用的Node.js框架。1.Next.jsNext.js是一个用于生产环境的React应用框架,使用它可以快速上手开发R......