bool isValid(string s)
{
if (s.size() % 2 == 1)
{
return false; // 假如是奇数个字符,则肯定有个括号落单
}
std::stack<char> chStack; // 初始化一个辅助栈,用于存放表示括号的字符
for (auto ch : s) // 遍历整个表示括号的字符串,挨个检查
{
switch (ch)
{
case '(': // 假如是左括号,先入栈了再说,期待与自己匹配的右括号出现
case '[':
case '{':
chStack.push(ch);
break;
// 假如是右括号,则栈不能为空,若栈为空,根据题意,不是有效的括号字符串
// 栈不为空的同时,栈顶元素还必须是与当前右括号匹配的左括号
// 检查栈顶元素匹配则弹出栈顶元素,继续字符串中下一个字符检查;不匹配直接返回
case ')':
if (chStack.empty() == true || chStack.top() != '(')
return false;
else
chStack.pop();
break;
case ']':
if (chStack.empty() == true || chStack.top() != '[')
return false;
else
chStack.pop();
break;
case '}':
if (chStack.empty() == true || chStack.top() != '{')
return false;
else
chStack.pop();
break;
// 其他情况,返回不匹配
default:
return false;
}
}
// 按照上述规则检查到的子串是有效的括号字符串
// 此时栈为空,字符串全部检查完,说明整个字符串是一个有效的符合题意的括号字符串
// 若栈不为空,比如说 "{{}[]([]){" ,最后栈中遗留了两个 '{' ,那也不是有效的括号串
return chStack.empty();
}
LeetCode - 20 有效的括号
于 2024-01-04 09:35:18 首次发布