BM44 有效括号序列
描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
数据范围:字符串长度 要求:空间复杂度
,时间复杂度
示例1
输入:
"()[]{}"
复制返回值:
true
复制
示例2
输入:
"[]"
复制返回值:
true
复制
示例3
输入:
"([)]"
复制返回值:
false
题解
思路:
遍历字符串:
- 如果是左括号,则入栈
- 如果是右括号,则判断是否和栈顶元素匹配
- 当遍历完字符串后,如果栈为空则完全匹配,否则匹配失败
代码如下:
// https://www.nowcoder.com/practice/37548e94a270412c8b9fb85643c8ccc2?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
bool isValid(std::string s)
{
static std::map<char, char> brackets = {
{'(', ')'},
{'{', '}'},
{'[', ']'}};
std::stack<char> left_brackets;
for (int i = 0; i < s.size(); ++i)
{
if (brackets.find(s[i]) != brackets.end())
{
left_brackets.push(s[i]);
}
else
{
if (left_brackets.empty())
{
return false;
}
auto l = left_brackets.top();
if (brackets[l] != s[i])
{
return false;
}
left_brackets.pop();
}
}
return left_brackets.empty();
}