有效的括号

有效的括号

CategoryDifficultyLikesDislikes
algorithmsEasy (40.21%)1262-

Tags

string | stack

Companies

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

有效字符串需满足:

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

注意空字符串可被认为是有效字符串。

示例 1:

1
2
输入: "()"
输出: true

示例  2:

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

示例  3:

1
2
输入: "(]"
输出: false

示例  4:

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

示例  5:

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

Discussion | Solution

解题思路

  • 从左到右顺序遍历每个字符
  • 使用一个栈来保存没有配对的字符
  • 如果为左括号,则将对应的右括号入栈;
  • 如果为右括号,
    • 如果栈为空,则不匹配,返回 false
    • 否则,栈不为空,则检查栈顶字符是否与当前字符相等:
      • 如果相等,则继续;
      • 否则,不匹配

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct Solution;

// @lc code=start
impl Solution {
    /// ## 解题思路
    /// - 栈+hashmap
    pub fn is_valid(s: String) -> bool {
        use std::collections::HashMap;
        let mut tmp = vec![];
        let pairs = HashMap::from([
            (')', '('),
            ('}', '{'),
            (']', '['),
        ]);
        for c in s.chars() {
            match c {
                '('|'['|'{' => {
                    tmp.push(c);
                },
                ')'|']'|'}' => {
                    if tmp.last() != pairs.get(&c) {
                        return false;
                    } else {
                        tmp.pop();
                    }
                },
                _ => {}
            }
        }
        return tmp.len() == 0;
    }
}
// @lc code=end


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public:
    bool isValid(string s) {
        stack<char> parens;
        map<char, char> pairs = {
            {')', '('},
            {'}', '{'},
            {']', '['},
        };

        for(char& c: s) {
            switch(c) {
                case '(':
                case '{':
                case '[': parens.push(c); break;
                case '}':
                case ']':
                case ')': {
                    if (parens.empty() || parens.top() != pairs[c] ) {
                        return false;
                    } else {
                        parens.pop();
                    }
                    break;
                }
                default:
                    break;

            }
        }

        return parens.empty();
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution:
    def isValid(self, s: str) -> bool:
        pairs = {
            '{': '}',
            '[': ']',
            '(': ')'
        }
        stack = []
        if len(s) == 0:
            return True
        if len(s) % 2 == 1:
            return False

        for c in s:
            if c in pairs:
                stack.append(pairs.get(c))
            elif len(stack) == 0:
                return False
            else:
                if c != stack.pop():
                    return False

        return len(stack) == 0
updatedupdated2024-08-252024-08-25