LeetCode 之 JavaScript 解答第20题 —— 有用的括号(Valid Parentheses)

Time:2019/4/11
Title: Valid Parentheses
Difficulty: Easy
Author: 小鹿

问题:Valid Parentheses

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

给定一个只包含 '('')''{''}''['']' 的字符串,推断字符串是不是有用。

有用字符串需满足:

  1. 左括号必需用雷同范例的右括号闭合。
  2. 左括号必需以准确的递次闭合。

注重空字符串可被认为是有用字符串。

Example 1:

Input: "()"
Output: true

Example 2:

Input: "()[]{}"
Output: true

Example 3:

Input: "(]"
Output: false

Example 4:

Input: "([)]"
Output: false

Example 5:

Input: "{[]}"
Output: true

Solve:

▉ 算法思绪

1、起首,我们经由过程上边的例子能够剖析出什么模样括号婚配是复合物前提的,两种状况。

  • 第一种(非嵌套状况):{} []
  • 第二种(嵌套状况):{ [ ( ) ] }

撤除这两种状况都不是相符前提的。

2、然后,我们将这些括号自右向左看作栈构造,右边是栈顶,左边是栈尾。

3、假如编译器中的括号左括号,我们就入栈(左括号不必搜检婚配);假如是右括号,就掏出栈顶元素搜检是不是婚配。(提早将成对的括号经由过程键值对的体式格局存到散列表中)

4、假如婚配,就出栈。不然,就返回 false;

▉ 代码完成

下方代码在规范的 Leetcode 测试中并非最省内存和效力高的,由于我们用到了 Map,在内

var isValid = function(s) {
    let stack = [];
    //将括号婚配存入散列表中
    let map = new Map();
    map.set(")","(");
    map.set("]","[");
    map.set("}","{");
    // 掏出字符串中的括号
    for(let i = 0; i < s.length; i++){
        let c = s[i];
        //假如是右括号,假如栈中不为空就出栈栈顶数据
        if(map.has(c)){
            //推断栈此时是不是为0
            if(stack.length !== 0){
                //假如栈顶元素不雷同,就返回 false
                if(stack.pop() !== map.get(c)){
                    return false;
                }
            //假如此时栈内无元素,返回false
            }else{
                return false;
            }
        }else{
            //假如是左括号,就进栈
            stack.push(c);
        }
    }
    //假如栈为空,括号悉数婚配胜利
    return stack.length === 0;
};
let str = "({(})";
console.log(isValid(str));

▉ 代码革新

1)该革新用对象替换了 Map,节省了内存空间。

2)在推断时,没有用到提早存储的构造,直接运用当碰到左括号是直接入栈,提高了实行效力。

var isValid = function(s) {
    let stack = [];
    var obj = {
        "]": "[",
        "}": "{",
        ")": "(",
    };

    for(var i = 0; i < s.length; i++) {
        if(s[i] === "[" || s[i] === "{" || s[i] === "(") {
            stack.push(s[i]);
        } else {
            var key = stack.pop();
            if(maps[key] !== s[i]) {
                return false;
            }
        }
    }
    if(!stack.length) {
        return true;
    }
    return false;
};

▉ 复杂度剖析

时刻复杂度: O(n)。只需要遍历一遍字符串中的字符,入栈和出栈的时刻复杂度为 O(1)。

空间复杂度: O(n)。当只要左括号近栈,没有右括号举行婚配的时刻是最蹩脚的状况,一切括号都在栈内。比方:{{{{{{{{{

迎接一同加入到 LeetCode 开源 Github 堆栈,能够向 me 提交您其他言语的代码。在堆栈上对峙和小伙伴们一同打卡,配合完美我们的开源小堆栈!
Github:https://github.com/luxiangqia…

    原文作者:小鹿
    原文地址: https://segmentfault.com/a/1190000018851060
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞