一、题目
二、思路
该题有点类似于分类匹配问题,考虑到括号的匹配必须相邻对应,有点像栈这个数据结构,左括号进栈,右括号匹配出栈。
三、题解
1.自己初步尝试
代码如下:
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
unordered_map<char,char> myhashmap;
myhashmap['['] = ']';
myhashmap['('] = ')';
myhashmap['{'] = '}';
for(int i = 0; i < s.size(); i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
stk.push('s[i]');
}
if(s[i] == myhashmap[stk.top()]){
stk.pop();
}
}
return stk.empty();
}
};
注:此处将左右括号映射到哈希表中是看题解后的做法。
关于利用栈进行判断,这里我走了不少弯路,首先,第一个位置有左右括号两种情况,如果是右括号不会push,那么投票元素是空,此处报错,其实实际上,如果第一个元素是右括号应该直接返回false才对,后来经过多次修改,我也是终于解出来了。
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
unordered_map<char,char> myhashmap;
myhashmap['['] = ']';
myhashmap['('] = ')';
myhashmap['{'] = '}';
for(int i = 0; i < s.size(); i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
stk.push(s[i]);
}else if(stk.empty() == true){
return false;
}else if(s[i] == myhashmap[stk.top()]){
stk.pop();
}else{
return false;
}
}
return stk.empty();
}
};
2.看题解后尝试
代码如下:
for (char ch: s) {
if (pairs.count(ch)) {
if (stk.empty() || stk.top() != pairs[ch]) {
return false;
}
stk.pop();
}
else {
stk.push(ch);
}
}
题解的判断略有不同,pairs为哈希表,不过内存消耗几乎差不多,此处也就不过多细究了。
总结
该题运用了哈希表和栈的知识,以后当遇到后进先出的队列,以及具有映射关系的数或字符,都可以考虑哈希表~