20 有效的括号(2021-04-23)

20. 有效的括号

链接:https://leetcode-cn.com/problems/valid-parentheses/

题目描述见链接内容。

解法

显然需要用栈解决,一开始我想用计数器的方式来解决,计数器方式的前提是这些括号可以穿插出现,那么([)]这种形式就是合法的了,这样与题目要求不符合

在仔细观察,符号要求的括号一定是满足的条件是:如果右括号出现,那么右括号的左边必须是左括号,这样才能满足要求

有了这个条件,代码本身就不难了:

var isValid = function (s) {
  const temp = [];
  let start = 0;
  const length = s.length;

  const paddingStr = {
    '}': '{',
    ']': '[',
    ')': '('
  };

  while (start < length) {
    const current = s[start];
    // 如果是左括号,那么压入栈中
    if (current === '(' || current === '{' || current === '[') {
      temp.push(current);
    } else {
      // 如果是右括号,那么要判断当前栈顶是不是对应的左括号,如果是的话,就将栈顶符号出栈
      if (temp[temp.length - 1] === paddingStr[current]) {
        temp.pop();
      } else {
        // 如果不是对应的额左括号,那么一定不是符合要求的表达式
        return false;
      }
    }
    // 继续迭代
    start += 1;
  }
  // 符合要求的表达式,栈一定是空的
  return temp.length === 0;
};
  • 时间复杂度:${O(N)}$
  • 空间复杂度:${O(N)}$
  • 执行用时:84ms, 在所有JavaScript提交中击败了73%的用户,内存消耗:38MB,在所有JavaScript提交中击败了69%的用户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值