LeetCode算法学习之--stack--有效括号

495 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

大家好今天给大家分享下一道 LeetCode 简单难度 的题目有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

题目

示例 1:

输入:s = "()"
输出:true
示例 2:

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

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

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

分析

1.匹配的括号必须是相同类型

2.左括号必须一正确的顺序闭合

3.成对的匹配

4.返回true or falses

解法

1.stack

2.includes

解法一:stack

思路 
1.利用array 模拟stack
2.建立一个字典dic来匹配对应的括号
3.因为括号需要正向的所以 一旦遇到 } ] )且stack数组为空 则表示违法
4.如果遇到了任意一个 } ] )则对比stack的顶层元素 不符合那也返回为false,
符合则stack.pop 排除最末尾的那个
5.循环结束后 看stack 是否为空 空则返回ture 反之返回false 
*/

var isValid = function (s) {
  // 创建字典
  const dic = {
    "{": "}",
    "[": "]",
    "(": ")",
  };

  const keys = Object.keys(dic);
  const strArr = s.split("");
  const stack = [];

  for (let i = 0; i < strArr.length; i++) {
    const element = strArr[i];
    // 因为括号需要正向的所以 一旦遇到 } ] )且stack数组为空 则表示违法
    if (!stack.length && !keys.includes(element)) {
      return false;
    }

    // 如果匹配dic的key说明是左边的括号 放入stack顶部
    if (keys.includes(element)) {
      stack.push(element);
    } else {
      // 匹配顶部元素
      const matchItem = dic[stack.pop()];
      //   不成功则返回false
      if (matchItem !== element) {
        return false;
      }
    }
  }

  //   循环结束后 看stack 是否为空 空则返回ture 反之返回false
  return stack.length > 0 ? false : true;
};

/* 复杂度
时间 最大为O(n) 最小为O(1)
空间 最大为O(n/2) 最小为O(1)
*/

1.png

解法二:includes

思路借鉴 https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-java-by-td0gn7z2gp/

思路
1.迭代字符串,如果包括{} () [] 则替换为空
2.迭代完成 如果s 为空 则返回true,反之返回false

*/
var isValid = function (s) {
  while (s.includes("()") || s.includes("{}") || s.includes("[]")) {
    s = s.replace("()", "");
    s = s.replace("[]", "");
    s = s.replace("{}", "");
  }

  return s === "" ? true : false;
};
/* 复杂度
时间 O(n^2)
空间 O(1)
*/

2.png

总结

这道题主要考察的是对stack的应用

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com