前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有效的括号

有效的括号

作者头像
五分钟学算法
发布2023-01-10 09:17:52
3460
发布2023-01-10 09:17:52
举报
文章被收录于专栏:五分钟学算法五分钟学算法

一、题目描述

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

有效字符串需满足:

  • 1、左括号必须用相同类型的右括号闭合。
  • 2、左括号必须以正确的顺序闭合。

二、题目解析

有效的括号满足以下几个条件:

  • 1、字符串的长度一定是偶数。
  • 2、括号的匹配遵循右括号和最近的一个左括号进行匹配,它们匹配成功才有可能是有效的括号
  • 3、对于有效的括号,它的部分子表达式仍然是有效的括号,如下图的(){[]},其中 () 是有效的括号,剩余的 {[]} 也是有效的括号。

具体操作步骤如下:

1、 遍历包含括号字符串数组中的所有元素

2、在遍历过程中,如果字符为左括号 ( ,那么就在栈中添加对左括号 (

3、在遍历过程中,如果字符为左括号 [ ,那么就在栈中添加对左括号 [

4、在遍历过程中,如果字符为左括号 { ,那么就在栈中添加对左括号 {

5、如果不是上述的 2、3、4,说明此时的字符是 )] } 这三种符号中的一种

6、如果这个时候栈已经为空,而现在遍历的字符是 )] } 这三种符号中的一种,说明找不到可以匹配的括号,可以直接返回 false

7、如果这个时候栈不为空,那么先获取栈顶元素,将栈顶元素和此时的访问的字符进行比较

8、如果相同,则将栈顶元素移除,继续执行 1

9、如果不相同,说明不匹配,返回 false

10、遍历完整个字符数组,判断栈是否为空,如果栈为空,说明字符数组中的所有括号都是闭合的,返回 true,如果栈不为空,说明有未闭合的括号,返回 false

三、参考代码

代码语言:javascript
复制
// LeetCode 100 题精讲:https://mp.weixin.qq.com/s/yznC53g46phq3qF7V4-obA
// 作者:程序员吴师兄
// 有效的括号( LeetCode 20 ):https://leetcode-cn.com/problems/valid-parentheses
class Solution {
    
    public boolean isValid(String s) {
      
      // 当字符串长度为奇数的时候,属于无效情况,直接返回 false
   if (s.length() % 2 == 1) {
           // 无效情况,返回 false
        return false;
    }
       
       //构建一个栈,用来存储括号
        Stack<Character> stack = new Stack<Character>();
        
        // 把字符串转换为数组的形式,方便获取字符串中的每个字符
        char charArray[] = s.toCharArray();
        
        // 遍历字符串数组中的所有元素
        for( int i = 0 ; i < charArray.length ; i++){
            
            // 获取此时的字符
            char c = charArray[i];   
            
            // 如果字符为左括号 ( ,那么就在栈中添加对左括号 (
            if(c == '('){
               
               // 添加对左括号 (
               stack.push('(');

             // 如果字符为左括号 [ ,那么就在栈中添加对左括号 [
            }else if(c == '['){

               // 添加对应的右括号 ]
               stack.push('[');

             // 如果字符为左括号 { ,那么就在栈中添加对左括号 {
            }else if( c == '{'){

               // 添加对应的右括号 }
               stack.push('{');

               // 否则的话,说明此时 c 是 )] } 这三种符号中的一种
            }else {
               
               // 如果栈已经为空,而现在遍历的字符 c 是 )] } 这三种符号中的一种
               // 找不到可以匹配的括号,返回 false
               // 比如这种情况  }{,直接从右括号开始,此时栈为空
               if(stack.isEmpty()) return false;
               
               // 如果栈不为空,获取栈顶元素
               char top = stack.peek();

               // 将栈顶元素和此时的元素 c 进行比较,如果相同,则将栈顶元素移除
               if( top == '(' && c == ')' || top == '[' && c == ']' || top == '{' && c == '}' ){
                   // 移除栈顶元素
                   stack.pop();
               }else{
                   // 如果不相同,说明不匹配,返回 false
                   return false;
               }
 
            }

        }
        
        // 遍历完整个字符数组,判断栈是否为空
        // 如果栈为空,说明字符数组中的所有括号都是闭合的
        // 如果栈不为空,说明有未闭合的括号
        return stack.isEmpty();
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目描述
  • 二、题目解析
  • 三、参考代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档