题目链接如下
https://leetcode-cn.com/problems/valid-parentheses/
完整代码如下
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;
for (char ch: s) {
if (pairs.count(ch)) {
if (stk.empty() || stk.top() != pairs[ch]) {
return false;
}
stk.pop();
}
else {
stk.push(ch);
}
}
return stk.empty();
}
};
代码看了好久才看懂, 防止遗忘, 将其总结如下:
下面分段分析
int n = s.size();
if (n % 2 == 1) {
return false;
}
输入的括号字符串为 s
, 当 s
的长度 n
是奇数时, 其一定不满足题目要求.
(当 n % 2 == 1
时, n
为奇数)
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
创建名为 pairs
的 无序 map 容器, 其中键为 ‘)’, ‘]’, ‘}’ (右括号), 值为’(’, ‘[’, ‘{’ (左括号)
该容器的作用如下:
pairs.count(key) // 在容器中查找以 key 键的键值对的个数
下面是难点
stack<char> stk; // ①
for (char ch: s) { // ②
if (pairs.count(ch)) { // ③
if (stk.empty() || stk.top() != pairs[ch]) { //④
return false;
}
stk.pop(); // ⑤
}
else {
stk.push(ch); // ⑥
}
}
①处: 创建名为 stk
的栈
②处: 使用变量 ch
从左往右逐个遍历输入的括号字符串 s
③处: 判断 ch
是否是容器 pair
中的 key (也就是判断 ch
是否为右括号)
- 若此处判定为否, 则说明
ch
不是右括号, 也就说明ch
是左括号, 则执行 ⑥ 处, 即将ch
压入栈stk
中. - 若此处判定为是, 则说明
ch
是右括号, 则执行 ④ 处的if
语句.
注: 当 ch
是右括号时, 只有栈顶元素为 ch
对应的左括号时, 才能保证 s
是有效的括号集合, 由此产生 ④ 处的代码.
④处: 如果栈是空的, 或者栈顶元素不等于 ch
对应的左括号, 则返回 false
, 判定 s
不是有效的括号集.
⑤处: 若不满足 ④ 处的 if
判定条件, 即栈顶元素是 ch
对应的左括号, 则可以执行此处的弹栈代码, 即将栈顶元素弹出.
return stk.empty();