LeetCode C++ 20. Valid Parentheses【Stack/String】简单

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

An input string is valid if:

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

Note that an empty string is also considered valid.

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

题意:判断给出的字符串是否是有效的括号匹配。其中,有效的定义是:开括号必须由同样类型的闭括号闭合;开括号必须以正确的顺序闭合。


思路:用栈。对给定的字符串 s 进行遍历,遇到一个左括号时,就期望后续的遍历之中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,正好符合栈的特点,我们就把这个左括号放入栈顶。

当我们遇到一个右括号时,需要一个相同类型的左括号闭合,此时就取出栈顶的左括号并判断它们是否是相同类型的括号:类型不同或者栈为空,就返回 false 。为了快速判断括号的类型,这里使用哈希表存储每一种右括号对应的相同类型的左括号

遍历结束后,如果栈为空,说明字符串 s 中的所有左括号正确闭合,返回 true ,否则返回 false

代码如下:

class Solution {
public:
    bool isValid(string s) {
        unordered_map<char, char> m;
        m[')'] = '(', m[']'] = '[', m['}'] = '{';
        stack<char> st;
        int size = s.size();
        for (int i = 0; i < size; ++i) {
            if (s[i] == '(' || s[i] == '[' || s[i] == '{') st.push(s[i]);
            else {
                if (st.empty() || st.top() != m[s[i]]) return false;
                else st.pop();
            }
        }
        return st.empty();
    }
};

我们注意到,有效字符串的长度一定为偶数,如果字符串的长度为奇数,可以直接返回 false ,省去后续的遍历。另外,查询一下 ASCII 码的差值,发现不需要用哈希表,也不用敲各种括号。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

优化的代码如下:

class Solution {
public:
	bool isValid(string s) {
		if (s.empty()) return true;
		if (s.size() & 1) return false;
		int size = s.size();
		stack<char> st;
		for (char c : s) {
			if (!st.empty() && (c - st.top() == 1 || c - st.top() == 2)) st.pop(); //右括号和左括号匹配
			else st.push(c);
		}
		return st.empty();
	}
};

效率:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户
内存消耗:6.3 MB, 在所有 C++ 提交中击败了79.06% 的用户

你可能感兴趣的:(LeetCode)