Hot100-Day53-T20有效的括号

1 阅读1分钟

Day53[26/3/24]T20有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([])"

输出:true

示例 5:

输入:s = "([)]"

输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

解题思路

其实很简单,就是创建一个栈,左括号压栈右括号弹栈,弹栈的同时检查一下栈顶和现在取到的右括号是不是匹配的,不匹配就 false。

此外需要注意的是有几个优化点,

  1. 如果一共是奇数个字符,直接 false
  2. 弹栈之前必须检查是否为空!
  3. 如果运行到最后,栈不为空,说明左括号个数更多,也不算匹配!

Code

#include <iostream>
#include <stack>

using namespace std;

class Solution
{
public:
    bool isValid(string s)
    {
        // 1. 奇数个必定假
        if (s.size() % 2)
        {
            return false;
        }
        // 2. 0个直接真
        if (s.size() == 0)
        {
            return true;
        }
        // 3. 开始压栈弹栈
        stack<char> braces;
        for (int i = 0; i < s.size(); i++)
        {
            switch (s[i])
            {
            case '(':
            case '[':
            case '{':
                braces.push(s[i]);
                break;
            case ')':
                if (braces.empty())
                {
                    return false;
                }
                if (braces.top() == '(')
                {
                    braces.pop(); // 弹栈
                }
                else
                {
                    return false;
                }
                break;
            case ']':
                if (braces.empty())
                {
                    return false;
                }
                if (braces.top() == '[')
                {
                    braces.pop(); // 弹栈
                }
                else
                {
                    return false;
                }
                break;
            case '}':
                if (braces.empty())
                {
                    return false;
                }
                if (braces.top() == '{')
                {
                    braces.pop(); // 弹栈
                }
                else
                {
                    return false;
                }
                break;

            default:
                break;
            }
        }

        return braces.empty();
    }
};

auto main() -> int
{
    cout << "Hello World!" << endl;
}