codewars 6kyu Valid Braces

codewars 6kyu Valid Braces

题目大意:给定一个由括号组成的字符串,判断这个字符串中的括号是否匹配。

给几个例子:
‘()’ >>true
‘({)}’ >> flase
‘{[()]}’ >>true

首先想到堆栈!用到了今天刚刚学到的 for of

function validBraces(braces) {
  //TODO
  var temp = [];
  for (ch of braces) {
    if (ch == "(" || ch == "[" || ch == "{") {
      temp.push(ch);
    } else if (ch == ")") {
      let a = temp.pop();
      if (a != "(") {
        temp.push(a);
        temp.push(ch);
      }
    } else if (ch == "]") {
      let a = temp.pop();
      if (a != "[") {
        temp.push(a);
        temp.push(ch);
      }
    } else if (ch == "}") {
      let a = temp.pop();
      if (a != "{") {
        temp.push(a);
        temp.push(ch);
      }
    }
    console.log(ch, temp);
  }
  if (temp.length == 0) {
    return true;
  } else {
    return false;
  }
}

最后的判断 if 的 5 行代码可以修改为一行:

return temp.length === 0;

看了别人的 solution,有个解法十分巧妙,运用到了字典进行括号的匹配判断,也同时运用堆栈

function validBraces(braces) {
  var matches = { "(": ")", "{": "}", "[": "]" };
  var stack = [];
  var currentChar;

  for (var i = 0; i < braces.length; i++) {
    currentChar = braces[i];

    if (matches[currentChar]) {
      // opening braces
      stack.push(currentChar);
    } else {
      // closing braces
      if (currentChar !== matches[stack.pop()]) {
        return false;
      }
    }
  }

  return stack.length === 0; // any unclosed braces left?
}

当然还有使用正则表达式的 sulution

function validBraces(braces) {
  while (/\(\)|\[\]|\{\}/g.test(braces)) {
    braces = braces.replace(/\(\)|\[\]|\{\}/g, "");
  }
  return !braces.length;
}

也可以用switch case解,也是用堆栈。

function validBraces(braces){
  for (var i = 0, depth = []; i < braces.length; i++) {
    switch (braces[i]) {
      case '(': case '[': case '{': depth.push(braces[i]); break;
      case ')': if (depth.pop() != '(') return false; break;
      case ']': if (depth.pop() != '[') return false; break;
      case '}': if (depth.pop() != '{') return false; break;
    }
  }
  return depth.length == 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值