20-有效的括号
@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com
Category | Difficulty | Pass rate | Tags | Companies |
---|---|---|---|---|
algorithms | Easy | 39.88% | string / stack | airbnb / amazon / bloomberg / facebook / google / microsoft / twitter / zenefits |
1. 题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses/
2. 解法
- 通过栈来解决。
- 遇见左括号就压入栈中,遇见右括号,则判断当前栈顶元素是否是对应的左括号。若是,则将该左括号出栈;若不是,则返回
false
。 - 最后根据栈是否为空来判断括号是否有效,栈为空则有效。
执行用时: 4 ms, 在所有 cpp 提交中击败了75.87%的用户
内存消耗: 8.6 MB, 在所有 cpp 提交中击败了71.46%的用户
class Solution {
public:
bool isValid(string s) {
stack<char> st;
map<char, char> m = { {'(', ')'}, {'[', ']'}, {'{', '}'} };
for (auto c : s) {
if (!st.empty() && m[st.top()] == c) {
st.pop();
} else if (m[c] == 0) { // m[c] == 0即:是右括号的情况
return false;
}else {
st.push(c);
}
}
return st.empty();
}
};