首页 > 其他分享 >【力扣】括号匹配(栈的应用)

【力扣】括号匹配(栈的应用)

时间:2024-03-06 15:59:39浏览次数:29  
标签:false return st 力扣 括号 push 匹配 empty

题目描述

顾名思义
代码如下:

#include<iostream>
#include<string>
#include<stack>
using namespace std;

bool isValid(string s){
	if(s.empty()){
		return true;
	}
	if(s.size()%2 != 0){
		return false;
	}
	int i = 0;
	stack<char> st;
	while(i < s.size()){
		if(s[i] == '('){
			st.push(')');
			//continue;
		}
		if(s[i] == '['){
			st.push(']');
			//continue;
		}
		if(s[i] == '{'){
			st.push('}');
			//continue;
		}
		if(s[i] == ')' || s[i] == ']' || s[i] == '}'){
			if(st.empty()){
				return false;
			}
			if(st.top() == s[i]){
				st.pop();
			}else{
				return false;
			}
			
		}
		i++;
	}
	return st.empty();
} 
//bool isValid(string s) {
//        if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
//        stack<char> st;
//        for (int i = 0; i < s.size(); i++) {
//            if (s[i] == '(') st.push(')');
//            else if (s[i] == '{') st.push('}');
//            else if (s[i] == '[') st.push(']');
//            // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
//            // 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
//            else if (st.empty() || st.top() != s[i]) return false;
//            else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
//        }
//        // 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
//        return st.empty();
//    }
int main(){
	string s;
	cin>>s;
	if(isValid(s)){
		cout<<"true";
	}else{
		cout<<"false";
	}
	return 0;
}

里面那个遇到左括号入栈右括号的小技巧很有意思。

标签:false,return,st,力扣,括号,push,匹配,empty
From: https://www.cnblogs.com/satsuki26681534/p/18056783

相关文章

  • 模糊匹配
    最近工作中需要实现一个模糊匹配的功能,这里记录一下实现方式:#include<stdio.h>#include<stdlib.h>#include<dirent.h>#include<string.h>#defineHASH_SIZE1000//哈希表大小,根据实际情况调整typedefstructNode{charfilename[256];//文件名最大长度......
  • sql语句in的用法(使用多个列进行匹配)
    原文链接:https://www.cnblogs.com/hellohui/p/17670858.html今天遇到了in的新用法,即文中的第四条,使用多个列进行匹配,在此记录下。使用列值列表进行匹配:SELECT*FROM表名WHERE列名IN(值1,值2,值3,...)使用子查询返回多个结果进行匹配:SELECT*FROM表名WHERE......
  • 力扣781.森林中的兔子
    题目:森林中有未知数量的兔子。提问其中若干只兔子"还有多少只兔子与你(指被提问的兔子)颜色相同?",将答案收集到一个整数数组answers中,其中answers[i]是第i只兔子的回答。给你数组answers,返回森林中兔子的最少数量。实现方法:由于要求兔子最少数量,可以假定答案相同的......
  • 局部匹配的查找
    问题:存在包含指定内容的返回“是”,否则返回“否”。函数公式解决:查找范围为同行:=IF(COUNTIF(B2,"*"&A2&"*"),"是","否")查找范围不限定行:=IF(COUNTIF(B:B,"*"&A2&"*"),"是","否")CountIf的条件使用前后都带通配符星号,表示“包含”。 ......
  • 代码随想录 第11天 | 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150.
    Leetcode:20.有效的括号-力扣(LeetCode)思路:就是用栈存左右括号,都为0就说明true,不为零说明有没有匹配成功的括号,是false,思路没有问题,时间超时了,还得用C++...,java更好的思路如下:如果是左括号,push右括号,如果是右括号,判断是否与栈顶元素匹配,JAVA//deque.isEmpty();这个方法返回......
  • 力扣88.合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m+n......
  • 力扣80.删除排序数组中的重复项 II
    题目:给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。实现方法:使用map计数,用快慢指针方法,快指针不断加一,慢指针在计数小于出现次数时加一,再将快指针指向的数赋给慢指针指向的数。funcremoveDuplicates(nums......
  • 力扣118.杨辉三角
    题目:给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。实现方法:从第三行开始,通过循环,依次求取上一行相邻两数的和,添加到结果里。funcgenerate(numRowsint)[][]int{ varr[][]int fori:=0;i<nu......
  • 牛客练习赛122 F 括号匹配 费用流
    CF打多了很多题目中的性质都挖掘出来了,也想到了费用流。很难\(dp\)因为一组中三个括号留下来一个很难作为状态进行dp。由于对括号匹配还不熟悉以为是\(n^2\)的图就没写了,事实上应该是线性的建图。所以对于\(n=2000\)这个数据范围网络流是可以过的。设置源点\(S\)和汇点\(T\)。......
  • 通过正则表达式匹配PNR编码中的航班信息
    PNR编辑内容主要由文本信息构,结果如下:一种方式是通过分隔符来提取信息,但效果是不理想的,因为格式会出现变化,推荐的方式是使用正则表达式,例如:1、通过正则获取航班号stringstrPattern=@"^[\s|\+|\-]?(?<Index>\d+)\.\s+\*?(?<FlightNo>\*?[A-Z0-9]{5,7})\s*(?<Level>[A-Z])\d......