Day53[26/3/24]T20有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
示例 5:
输入:s = "([)]"
输出:false
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
解题思路
其实很简单,就是创建一个栈,左括号压栈右括号弹栈,弹栈的同时检查一下栈顶和现在取到的右括号是不是匹配的,不匹配就 false。
此外需要注意的是有几个优化点,
- 如果一共是奇数个字符,直接 false
- 弹栈之前必须检查是否为空!
- 如果运行到最后,栈不为空,说明左括号个数更多,也不算匹配!
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;
}