LeetCode腾讯精选练习50题-20.有效的括号

题目描述

  • 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
  • 有效字符串需满足:
  • 1、左括号必须用相同类型的右括号闭合。
  • 2、左括号必须以正确的顺序闭合。
example
input  : s = "()[]{}"
output : true
input  : s = "([)]"
output : false
input  : s = "{[]}"
output : true

解题思路

  • 借助栈

  • 遍历字符串

    • 遇到左括号则入栈
    • 遇到右括号则判断栈顶元素是否可以与之配对成功
      • 若配对成功则弹出栈顶元素
      • 若配对失败则返回false
  • 遍历结束后判断栈是否为空

    • 若栈空说明全部可以匹配成功,整体是有效的括号,返回true
    • 若栈不空说明左括号有多余的,整体不是有效的括号,返回false
  • 时间复杂度:O(n),n为字符串长度

  • 空间复杂度:O(n),n为字符串长度

  • 可将配对元素抽出统一放到Map中,当题目扩展之后,可以简化后续遍历判断过程的代码书写(见代码Solution2),相应的,空间复杂度会随着可配对元素总数m增加,形式为O(n + m)

代码(Java)

public class Solution {
    public boolean isValid(String s) {
        if (s.length() % 2 != 0) {
            return false;
        }
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '[' || ch == '(' || ch == '{') {
                stack.push(ch);
            } else {
                if (stack.empty()) {
                    return false;
                } else {
                    char top = stack.peek();
                    if (ch == ']' && top != '[') {
                        return false;
                    } else if (ch == ')' && top != '(') {
                        return false;
                    } else if (ch == '}' && top != '{') {
                        return false;
                    } else {
                        stack.pop();
                    }
                }
            }
        }
        return stack.empty();
    }
}
public class Solution2 {
    public boolean isValid(String s) {
        int len = s.length();
        if (len % 2 == 1) {
            return false;
        }
        // 将配对元素抽出,如果题目拓展为不仅仅判断括号是否有效匹配
        // 如在此基础上增加了<与>可配对等等,先使用Map将配对元素定义出来可以简化后续判断过程的书写
        Map<Character, Character> map = new HashMap<>(3);
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < len; i++) {
            char ch = s.charAt(i);
            if (map.containsKey(ch)) {
                if (stack.empty() || map.get(ch) != stack.peek()) {
                    return false;
                }
                stack.pop();
            } else {
                stack.push(ch);
            }
        }
        return stack.empty();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值