美文网首页
leetcode算法-有效的括号

leetcode算法-有效的括号

作者: Weastsea | 来源:发表于2020-04-28 23:05 被阅读0次

有效的括号

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

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

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

这个题的主要思路是通过数组模拟栈的结构来实现。思路如下:准备2个数组,作为栈a和栈b, 为了简单理解,我们统一假设下标为0的设置为栈底,最后一个元素为栈顶。然后栈a栈顶元素跟下一个元素进行比较,如果匹配,就跟下一个元素两个出栈,弹出。如果不匹配,我们准备第二个栈b,用于存放不匹配的元素压栈底,然后继续比较栈a的栈顶元素跟下一个元素,如果不匹配,就跟栈b的栈顶元素匹配,如果匹配就栈a和栈b的栈顶元素都出栈,如果不匹配继续压入栈b,持续以上过程,直到
栈a为空,说明全部匹配,如果不为空,则有不匹配的

代码的实现:

var isValid = function (s) {
    const Map = {
        '(': '1',
        ')': '1',
        '{': '2',
        '}': '2',
        '[': '3',
        ']': '3',
    }
    const a = s.split('')
    const b = []
    let l = a.length - 1
    while (l >= 0) {
        if (Map[a[l]] === Map[a[l - 1]] && a[l] !== a[l - 1]) {
            a.splice(l - 1, 2)
            l -= 2
        } else {
            // 如果匹配,栈a和栈b的栈顶元素都出栈
            if (
                Map[a[l]] === Map[b[b.length - 1]] &&
                a[l] !== b[b.length - 1]
            ) {
                a.pop()
                b.pop()
                l--
            } else {
                b.push(a[l])
                a.pop()
                l--
            }
        }
    }
    return b.length === 0
}

执行效率如下:

参考下leetcode比较好的实现,同样,我们先描述下思路:
思路
思路类似于上一个方法:我们从数组下标为0开始,如果匹配 '{' '(' '[' ,就直接放入栈中我们维护一个map,设计很巧妙,如下所示。循环遍历s,如果发现不是'{' '(' '['这3个的时候,我们通过s[i] !== map[stack.pop()]这个表达式做了2件事情,判断s[i] 是否等于栈顶的元素,不管是否等于,此时栈顶的元素已经出栈,也就是如果等于的话,栈顶的元素已经出栈,如果不等于,则直接返回false,说明表示有效的括号

代码实现:

var isValid = function (s) {
    const map = {
        '{': '}',
        '(': ')',
        '[': ']',
    }
    const stack = []
    for (let i = 0; i < s.length; i++) {
        if (map[s[i]]) {
            stack.push(s[i])
        } else if (s[i] !== map[stack.pop()]) {
            return false
        }
    }
    return stack.length === 0
}

执行效率相当高效


相关文章

  • leetcode算法-有效的括号

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

  • 2020-09-20

    数据结构与算法系列(一)栈:如何实现有效括号的判断? 有效括号,我想很多人对LeetCode上的这道题很熟悉吧? ...

  • PHP之高频考点算法合辑

    有效括号 LC: Valid Parentheses - LeetCode[https://leetcode.co...

  • 有效括号 Click here for leetcode details[https://leetcode-cn....

  • LeetCode刷题-有效的括号

    前言说明 算法学习,日常刷题记录。 题目连接 有效的括号[https://leetcode-cn.com/prob...

  • 一文秒杀三道括号相关的题目

    读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 20.有效的括号[https:/...

  • 算法:leetcode 32 最长有效括号

    题意 输入类似“((())(",请找出最长的有效括号。 分析 对于任意的一个有效括号来说,它肯定是一个”(“一个左...

  • leetcode算法-20-有效的括号

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

  • LeetCode 32. 最长有效括号 | Python

    32. 最长有效括号 题目来源:力扣(LeetCode)https://leetcode-cn.com/probl...

  • leetcode 有效的括号

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

网友评论

      本文标题:leetcode算法-有效的括号

      本文链接:https://www.haomeiwen.com/subject/ymuiwhtx.html