本题主要使用栈的思想,使用哈希表进行查找配对,这样比较方便
话不多说放码过来:
class Solution {
public:
bool isValid(string s) {
//奇数个的字符串绝对为false
int n = s.size();
if(n % 2 == 1) return false;
//使用哈希表键值对进行查找和配对:
//因为在遍历到右括号时才需要进行查找配对,故将右括号作为键值
unordered_map<char, char> map = {
{')', '('},
{'}', '{'},
{']', '['}
};
stack<char> stk;//创建栈
//推荐使用for(auto i : s)直接对字符串s进行遍历,利用i查找配对
//否则需要通过s[i]作为哈希表的键值查找配对
for(int i = 0; i < n; i++){
//判空,不判空会报错
if(stk.empty() || map.find(s[i]) == map.end()){
//找不到对应键值说明为左括号,压入栈中
stk.push(s[i]);
}
else{
//找得到则为右括号,需要查找配对
if(stk.top() == map[s[i]]){
//若栈顶括号与当前键值对相同则配对成功,将栈顶删除
stk.pop();
}
else{
//配对失败说明后遇到的左括号不能先闭合,不是有效括号,判负
return false;
}
}
}
//遍历结束后若栈内为空说明所有左括号都顺利闭合,为有效括号
// if(stk.empty()) return 1;
// else return 0;
return stk.empty();
}
};