class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;//为奇数不是都成对
}
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};//利用unordered_map<键, 值>将右括号和左括号进行匹配
stack<char> stk;//建立一个栈,因为通过分析可知左括号是先进后匹配也就是后出,刚好对应栈的特性
for (char ch: s) {//遍历数组
if (pairs.count(ch)) {
//pairs.count(ch)是对unordered_map容器中的元素进行计数的操作。它返回具有给定键ch的元素的个数。
//具体而言,对于给定的键ch,如果在pairs中存在相应的元素,则返回值为1;如果不存在,则返回值为0。
//如果ch有对应元素就接着判断栈内和栈顶
if (stk.empty() || stk.top() != pairs[ch]) {//栈为空或者栈顶不是对应左括号
//用于比较栈顶元素与给定键ch在pairs中对应的值是否相等。
//具体而言,这个条件语句用于检查栈顶元素与给定键对应的值是否匹配。如果栈顶元素与值不相等,意味着当前的括号不匹配
return false;
}
stk.pop();//为对应左括号则弹出
}
else {//该else对应还未加入该栈的元素
stk.push(ch);
}
}
return stk.empty();
}
};
力扣解析中利用了unordered_map,unordered_map是根据哈希表建成的
一个链表中,每一个对应不止一个元素,将相同属性的放在同一个中
将右括号设为键左括号设为值
利用unordered_map中count方法计算map容器中是否有ch的键所对应的值,有就说明为右括号
在证明了该元素为右括号后,就查看栈中是否有对应值,栈为空或栈顶不为对应值都说明没有匹配的括号
else就说明有对应左括号,并将其弹出栈
最后利用判断栈是否为空检查是否有未匹配的括号