LeetCode 20:有效的括号

一、题目描述

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

提示:

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

二、思路分析

有题目可知,只有三种类型的字符串:()、{}、[],并且可以知道本题使用 栈 来进行解决,因为符合后出现的字符括号需先匹配的原则,即后进先出,是栈的特性。

所以本题的一个解决思路:

1、字符串的长度一定为偶数,为奇数则一定不能完全匹配完,即奇数长度一定为 false;

2、将所有的左括号存入栈中,当遇到右括号时,将右括号和栈顶元素进行匹配,如果不是一对有效括号,则直接返回 false;

三、代码参考

1、Java 

class Solution {
    public boolean isValid(String s) {
        // 单数长度的字符串一定为 false
        if(s.length() % 2 == 1){
            return false;
        }
        // 创建一个栈空间来装字符串中的左符号
        Stack<Character> stack = new Stack<>();
        // 循环遍历数组
        for(int i = 0; i < s.length(); i++){
            // 获取当前索引值为 i 的字符元素
            char str = s.charAt(i);
            // 判断字符是否为左括号,如果是则入栈
            if(str == '('){
                stack.push('(');
            }else if(str == '{'){
                stack.push('{');
            }else if(str == '['){
                stack.push('[');
            }
            // 如果不是左括号,则与栈顶元素进行比较,看是否为一对符号
            else{
                // 先判断栈是否为空,如果已经为空,则直接返回 false
                if(stack.isEmpty()){
                    return false;
                }
                // 不为空,则取栈顶元素进行比较
                // 获取栈顶元素
                char stackTop = stack.peek();
                // 进行比较
                if(stackTop == '(' && str == ')' || stackTop == '{' && str == '}' || stackTop == '[' && str == ']'){
                    // 匹配成功,移除栈顶元素
                    stack.pop();
                }else{
                    // 匹配失败则返回 false
                    return false;
                }
            }
        }
        // 循环结束,判断栈空间是否为空,如果为空,则全部匹配成功,返回 true,不为空,则为 false
        return stack.isEmpty();
    }
}

2、Python

class Solution(object):
    def isValid(self, s):
        # 单数长度的字符串一定为 False
        if len(s) % 2 == 1:
            return False
        # 创建一个栈空间来装字符串中的左符号
        stack = list()
        # 循环遍历数组
        for str in s:
            # 判断字符是否为左括号,如果是则入栈
            if str == '(':
                stack.append('(')
            elif str == '{':
                stack.append('{')
            elif str == '[':
                stack.append('[')
            # 如果不是左括号,则与栈顶元素进行比较,看是否为一对符号
            else:
                # 先判断栈是否为空,如果已经为空,则直接返回 false
                if not stack:
                    return False
                # 不为空,则取栈顶元素进行比较
                # 获取栈顶元素
                stackTop = stack[-1]
                # 进行比较
                if stackTop == '(' and str == ')' or stackTop == '{' and str == '}' or stackTop == '[' and str == ']':
                    # 匹配成功,移除栈顶元素
                    stack.pop()
                else:
                    # 匹配失败则返回 False
                    return False
        # 循环结束,判断栈空间是否为空,如果为空,则全部匹配成功,返回 True,不为空,则为 False
        return not stack

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HackerHaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值