题目


给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列。
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

数据范围:字符串长度 0≤n≤10000

要求:空间复杂度 O(n),时间复杂度 O(n)

示例1

输入:
"["
返回值:
false

示例2

输入:
"[]"
返回值:
true

示例3

输入:
"{{"
返回值:
false

思路


使用一个辅助栈,每次遇到'(','{','['这三种字符的时候,将字符入栈;而每次遇到')','}',']'这三种字符的时候则让对应的匹配字符出栈。

解答代码


class Solution {
public:
    /**
     * @param s string字符串 
     * @return bool布尔型
     */
    bool isValid(string s) {
        // write code here
        auto size = s.size();
        if (size == 0 || size % 2 == 1) {
            return false;
        }
        stack<char> tmp;
        for (int i = 0; i < size; i++) {
            if ('(' == s[i] || '{' == s[i] || '[' == s[i]) {
                tmp.push(s[i]);
            } else if (')' == s[i]) {
                if (tmp.empty() || tmp.top() != '(') {
                    return false;
                }
                tmp.pop();
            } else if ('}' == s[i]) {
                if (tmp.empty() || tmp.top() != '{') {
                    return false;
                }
                tmp.pop();
            } else if (']' == s[i]) {
                if (tmp.empty() || tmp.top() != '[') {
                    return false;
                }
                tmp.pop();
            }
        }
        // 退出循环后需保证栈内没有元素才是有效的
        if (!tmp.empty()) {
            return false;
        }
        return true;
    }
};

吴尼玛
32 声望11 粉丝

记问之学