【每日一题】LeetCode 20.有效的括号(栈、字符串)

【每日一题】LeetCode 20.有效的括号(栈、字符串)

题目描述

给定一个只包含括号字符的字符串 s,判断该字符串是否为有效的括号序列。一个有效的括号序列需要满足以下条件:

  1. 每个左括号 ()[]{} 必须有一个对应的右括号与之匹配。

  2. 括号必须按照正确的顺序闭合,即左括号必须在右括号之前出现。

示例

输入

  • 字符串 s,长度在 110^4 之间,仅由括号字符 ()[]{} 组成。

输出

  • 布尔值,如果字符串 s 是有效的括号序列,则返回 true;否则返回 false

示例

  1. 输入:s = "()"

    • 输出:true
    • 解释:字符串中的括号正确闭合。
  2. 输入:s = "()[]{}"

    • 输出:true
    • 解释:字符串中的括号正确闭合。
  3. 输入:s = "(]"

    • 输出:false
    • 解释:'(' 没有被正确闭合。
  4. 输入:s = "([])"

    • 输出:true
    • 解释:字符串中的括号正确闭合。

思路分析

为了判断一个字符串是否是有效的括号序列,我们可以使用一个栈(Stack)来处理这个问题。栈是一种后进先出(LIFO)的数据结构,非常适合处理这种成对出现的问题。

  1. 遍历字符串:逐个字符遍历字符串 s
  2. 处理左括号:如果当前字符是左括号(([{),则将其压入栈中。
  3. 处理右括号:如果当前字符是右括号()]}),则需要检查栈顶元素:
    • 如果栈为空,或者栈顶元素与当前右括号不匹配,则说明序列无效,返回 false
    • 如果栈顶元素与当前右括号匹配,则将栈顶元素弹出。
  4. 最终检查:遍历完字符串后,如果栈为空,则说明所有左括号都找到了匹配的右括号,返回 true;否则返回 false

代码实现

class Solution {
    public boolean isValid(String s) {
        // 使用栈来存储左括号
        Stack<Character> stack = new Stack<>();
        // 遍历字符串中的每个字符
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // 如果是左括号,压入栈中
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            } else {
                // 如果栈为空,说明没有对应的左括号,返回 false
                if (stack.isEmpty()) {
                    return false;
                }
                // 检查栈顶元素是否与当前右括号匹配
                if ((c == ')' && stack.peek() != '(') ||
                    (c == '}' && stack.peek() != '{') ||
                    (c == ']' && stack.peek() != '[')) {
                    return false;
                }
                // 如果匹配,则弹出栈顶元素
                stack.pop();
            }
        }
        // 如果栈为空,说明所有括号都正确闭合,返回 true;否则返回 false
        return stack.isEmpty();
    }
}
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值