20 - 有效的括号 - python+ Java

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

有效字符串需满足:

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

示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

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

示例 5:


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

判断字符串中给关于括号的有效性,使用栈保存左括号,如果入栈的是右括号,则将其和栈顶元素进行比较:

  • 如果两者不匹配,直接放回False
  • 否则栈顶元素出栈,右括号不入栈
  • 最后判断栈是否为空
class Solution(object):
    def isValid(self, s):
        stack = []
        d = {")": "(", "}": "{", "]": "["}
        for i in s:
            if i == '(' or i == '{' or i == '[':
                stack.append(i)
            else:
                # 如果是右括号则判断当前栈顶元素是否是对应的左括号
                # 如果是则弹出栈顶元素,同时右括号不入栈
                # 否则直接返回False
                if stack and d[i] == stack[-1]:
                    stack.pop()
                else:
                    return False 

        return stack == []

2020 - 8 - 1 更新Java代码, Java的实现需要使用Stack和Map这两个容器,本质上和Python的实现逻辑是一致的,如下所示:


class Solution {
    public boolean isValid(String s) {
        Map<Character, Character> map = new HashMap<>();
        map.put('}', '{');
        map.put(')', '(');
        map.put(']', '[');

        Stack<Character> helper = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            Character c = s.charAt(i);
            // 判断是否为左括号
            if (map.containsKey(c)) {
                // 如果是左括号,看它在map中的值和栈顶元素的匹配情况
                Character value = map.get(c);
                // 获取栈顶元素
                char top = helper.isEmpty() ? '$' : helper.peek();
                // 如果不匹配,直接返回false
                if (value != top) {
                    return false;
                } else {
                    // 如果匹配,只将栈顶元素弹出
                    helper.pop();
                }
            } else {
                // 如果栈中没有,则入栈
                helper.push(c);
            }
        }

        return helper.isEmpty();
    }
}

你可能感兴趣的:(Leetcode)