# 20. 有效的括号:暴力法和栈方法


tags:

  • string
  • stack
  • HOT-100

# 题目链接

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

# 方法一:暴力法

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    while (s.length) {
        let temp = s;
        s = s.replace('()', '');
        s = s.replace('{}', '');
        s = s.replace('[]', '');
        if (s == temp) {
            return false;
        }
    }
    return true;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

√ Accepted

  • 76/76 cases passed (76 ms)
  • Your runtime beats 10 % of javascript submissions
  • Your memory usage beats 6.67 % of javascript submissions (36.3 MB)
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

# 方法二:栈方法

LeetCode 官方解题思路写得很不错,详见:https://leetcode-cn.com/problems/valid-parentheses/solution/,在这我就不赘述了。

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let rightParen = [];
    for (let i = 0; i < s.length; i++) {
        if (s[i] === '(') {
            rightParen.push(')');
        } else if (s[i] === '[') {
            rightParen.push(']');
        } else if (s[i] === '{') {
            rightParen.push('}');
        } else if (s[i] !== rightParen.pop()) {
            return false;
        }
    }
    return !rightParen.length;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

√ Accepted

  • 76/76 cases passed (52 ms)
  • Your runtime beats 82.79 % of javascript submissions
  • Your memory usage beats 51.67 % of javascript submissions (34.1 MB)
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

# 方法三:栈的另一种写法

与方法二类似,只是将 if...else 判断换成了 map

var isValid = function (s) {
    var map = {
        "(": ")",
        "[": "]",
        "{": "}"
    }
    var leftParen = [];
    for (var paren of s){
        if (paren in map) leftParen.push(paren); // 为左括号时,顺序保存
        else { // 为右括号时,与数组末位匹配
            if(paren !== map[leftParen.pop()]) return false;
        }
    }
    return !leftParen.length // 防止全部为左括号
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)