LeetCode20:有效的括号

原题地址:. - 力扣(LeetCode)

题目描述

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

有效字符串需满足:

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

示例 1:

**输入:**s = "()"

**输出:**true

示例 2:

**输入:**s = "()[]{}"

**输出:**true

示例 3:

**输入:**s = "(]"

**输出:**false

示例 4:

**输入:**s = "([])"

**输出:**true

提示:

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

解题思路

  • 输入检查 :首先检查输入字符串是否为空或长度为零。如果是,则返回 true,表示有效。
  • 长度检查 :如果字符串的长度小于等于 1 或者是奇数,直接返回 false,因为无法匹配成对的括号。
  • 使用栈 :创建一个栈来存放左括号。遍历字符串中的每个字符:
    • 如果当前字符是左括号 ([{,将其压入栈中。
    • 如果当前字符是右括号 )]},则检查栈是否为空:
      • 如果为空,说明没有左括号可以匹配,返回 false
      • 如果不为空,弹出栈顶元素并检查它是否与当前右括号匹配。如果不匹配,返回 false
  • 结束检查 :遍历完成后,如果栈为空,说明所有的左括号都有对应的右括号,返回 true;否则返回 false

源码实现

java 复制代码
class Solution {
    public boolean isValid(String s) {
        // 检查输入是否为空或长度为零
        if (s == null || s.length() == 0) {
            return true; // 空字符串被认为是有效的
        }

        // 检查长度是否小于等于1或为奇数
        if (s.length() <= 1 || s.length() % 2 != 0) {
            return false; // 不能成对匹配
        }

        // 创建一个栈来存放左括号
        Stack<Character> stack = new Stack<Character>();

        // 遍历字符串中的每个字符
        for (char c : s.toCharArray()) {
            // 如果是左括号,压入栈中
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
                continue;
            }

            // 如果是右括号,检查栈是否为空
            if (stack.isEmpty()) {
                return false; // 没有对应的左括号
            }

            // 检查栈顶元素是否匹配
            if (c == ')' && stack.pop() != '(') {
                return false; // 不匹配
            } else if (c == ']' && stack.pop() != '[') {
                return false; // 不匹配
            } else if (c == '}' && stack.pop() != '{') {
                return false; // 不匹配
            }
        }

        // 如果栈为空,所有括号都匹配,返回true;否则返回false
        return stack.isEmpty();
    }
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。我们只需遍历字符串一次,栈的入栈和出栈操作的时间复杂度为 O(1)。
  • 空间复杂度:O(n),在最坏的情况下,栈中可能会存放所有的左括号(例如字符串为 "((("),因此需要 O(n) 的空间。
相关推荐
李崧正10 分钟前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命12 分钟前
鳶尾花項目JAVA
java·开发语言·机器学习
BIGmustang13 分钟前
python练手之用tkinter写一个计算器
开发语言·python
二哈赛车手18 分钟前
新人笔记---实现简易版的rag的bm25检索(利用ES),以及RAG上传时的ES与向量数据库双写
java·数据库·笔记·spring·elasticsearch·ai
winner888121 分钟前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
AI人工智能+电脑小能手30 分钟前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试
bzmK1DTbd39 分钟前
SOLID原则在Java中的实践:单一职责与开闭原则
java·开发语言·开闭原则
AI进化营-智能译站42 分钟前
ROS2 C++开发系列07-高效构建机器人决策逻辑,运算符与控制流实战
开发语言·c++·ai·机器人
winner888143 分钟前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++
不会编程的懒洋洋1 小时前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke