题目:
如果括号两两匹配,则true,如果不匹配或者不按着顺序匹配( [ )],则false.
思路:
不匹配的情况有三种,左括号数量多余,左右数量相等但不匹配,右括号数量多余
用stack存放括号,unordered_map表示括号与数字的对应关系
如果遇到左括号就入栈,如果遇到右括号,
有两种不匹配情况,一种是右括号多余,另一种是不匹配,则返回false
如果匹配则栈顶弹出对应的左括号
最后判断stack是否为空,即没有多余的左括号这种不匹配情况,至此三种不匹配情况都包含了。
代码方面的问题:
1未熟练掌握unordered_map的用法,思路上想用一个数据结构表示不同的括号与数字的对应关系,不知道怎么写,哈希表
unordered_map 与map的区别,map键的存储是默认升序的,unordered_map键的存储是无序的,查找效率比较高
/*
* @lc app=leetcode.cn id=20 lang=cpp
*
* [20] 有效的括号
*/
// @lc code=start
class Solution {
public:
bool isValid(string s) {
//判断是否有匹配的括号,括号入栈,如果遇到左括号入栈,右括号
unordered_map<char,int> mymap = {
{'(',1},
{'[',2},
{'{',3},
{')',6},
{']',5},
{'}',4}
};
stack<char> mystack;
for(char num:s)
{//如果是左括号,入栈
if(mymap[num]<4)
{
mystack.push(num);
}
else{
//如果栈为空(代表了有多余的右括号),或者当前括号与栈顶元素不匹配
if(mystack.empty()|| mymap[num] + mymap[mystack.top()] !=7 )
{
return false;
}
else
{
mystack.pop();
}
}
}
return mystack.empty();
}
};
// @lc code=end