111
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
class Solution {
public:
bool isValid(string s) {
if(s.size()%2)return false;
unordered_map<char,char>hp={
{')','('},
{']','['},
{'}','{'}
};
stack<char>sk;
for(auto& x:s){
if(hp.count(x)){//右括号
if(sk.empty()||hp[x]!=sk.top()){
return false;
}
sk.pop();
}
else{
sk.emplace(x);//左括号入栈
}
}
return sk.empty();
}
};
首先,对于开始的条件如果能直接判断出一部分结果的话,一定要写出来,就比如说字符串长度是奇数的话。
第二,empty的判断一定要在top之前,如果反过来的话,空栈是没法取到top元素的。
第三,如果能到pop这一步,那就说明,栈既不是空的,而且元素也是与之匹配的。
第四,返回结果,如果字符串遍历到最后的话,栈是空的说明是true,而如果不空,说明失败了,恰好,是空栈返回的是true。
对于哈希表来说:
count代表是否存在于哈希表里,1就是存在,0就是不存在。
find代表找到当前key值的迭代器位置,也就是把指针指过去。
auto ite1=hp.find('x');
auto ite2=hp.count('x');
ite1->first,ite1->second;
ite2==1||ite2==0;