LeetCode-20 有效的括号
时间:2022-06-24
本文章向大家介绍LeetCode-20 有效的括号,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
↑点击上面"算法半岛"
关注"算法半岛"第一时间接收最新文章
> 题目:20. 有效的括号
> 难度:简单
> 分类:栈
> 解决方案:入栈出栈
今天我们学习第20题有效的括号,这是一道关于栈的简单题,对熟悉栈的基本使用很有帮助。下面我们看看这道题的题目描述。
题目描述
给定一个只包括 (
, )
, {
, }
, [
, ]
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"输出: true
示例 2:
输入: "()[]{}"输出: true
示例 3:
输入: "(]"输出: false
示例 4:
输入: "([)]"输出: false
示例 5:
输入: "{[]}"输出: true
分析
这个题是目前为止遇到的第一个栈相关题目,对于栈不太熟悉的小伙伴可以扫描文章下方的二维码,关注『 算法半岛』回复『 数据结构目录』,即可获得相关学习资料。
对于这个题,我们借助一个栈,遍历字符串时,当遇到 (
、 {
或 [
时,将字符入栈;当遇到 )
、 }
或 ]
时,判断栈顶是否为其对应的左括号,如果对应得上,弹出栈顶元素,如果栈顶为空或则对应不上,则返回 false
。对示例5的详细示意图如下所示:
上述分析所对应的 java
代码如下所示:
class Solution { public boolean isValid(String s) { // 申请栈 Stack<Character> stack = new Stack<>();
// 将字符串转化为字符数组 char[] chars = s.toCharArray();
for (int i=0; i<chars.length; i++){ // 判断当前字符是否为 '(' 、'[' 或 '{' if (chars[i] == '(' || chars[i] == '[' || chars[i] == '{'){ // 如果时,则入栈 stack.push(chars[i]); }else{ // 如果不是,则为')'、']'或'}'',判断栈顶是否为对应的左括号 if (stack.empty()){ return false; }else{ char c = stack.pop(); if ((chars[i] == ')' && c != '(') || (chars[i] == ']' && c != '[') || (chars[i] == '}' && c != '{')){ return false; } } } }
// 只有当栈为空时,才为true return stack.empty() ? true : false;
}}
Github地址
LeetCode-20 有效的括号:https://github.com/JacobLei/leetcode/blob/master/src/main/java/A20_ValidParentheses.java)
参考链接
有效的括号:https://leetcode-cn.com/problems/valid-parentheses/
- 从一次 Snowflake 异常说起
- 分布式事务 TCC-Transaction 源码分析 —— Dubbo 支持
- 2016 腾讯软件开发面试题(部分)
- 分布式事务 TCC-Transaction 源码分析 —— 运维平台
- 2016美团面试经历
- 2016年百度面试经历
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig
- Golang 中"泛型"的支持
- 编码习惯之Controller规范
- Go-简洁的并发
- 多线程基础之Runnable/Thread与Callable
- 使用Ldoc给Lua生成文档
- MySQL 读写分离
- Mac必备软件集之Brew
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- POJ 2955 区间DP必看的括号匹配问题,经典例题
- POJ 3211 Washing Clothes
- 1745 Divisibility
- POJ 3616 Milking Time
- C++面向对象编程类对象的定义
- Codeforce 1102 C. Doors Breaking and Repairing
- CodeForces - 1102B Array K-Coloring
- background-size之详解
- a伪类
- CodeForces - 1102A(思维题)
- C++使用指针,动态数组,指针做参数需要注意的问题等总结
- POJ 1170 Shopping Offers非状态压缩做法
- HDU 4283 You Are the One
- C++cin,cout以及常见函数总结,cin,cout格式化控制
- 最简单,最明了,看了就会的VScode和C++的配置!(Visual Studio Code)