题解更新:
解题思路
右括号:上来,自己动
代码
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}//字符串长度为奇数直接返回false
//键:就是存的值的编号
//值:就是要存放的数据
//说到底这个题目中,都是左括号在自己动
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};//哈希表,匹配的符号同一哈希值
stack<char> stk;//建栈
for (char ch: s) {//遍历s中的字符
//这个判断是为了判断现在遍历到的字符是哈希表中的值吗
//也就是说看这个字符是括号还是括回,
//如果不是哈希表中的值,也就是括号,那就直接else,压入栈中
//如果是哈希表中的值,也就是括回(右边的),那就执行下面的操作
if (pairs.count(ch)) {
//如果此时的栈为空 或者 栈顶元素和当前的元素不匹配
//栈为空:说明现在这个符号只有右括回,没有左括号
//与栈顶不匹配,说明不符合题目括号闭合要求
//特别的是:[{}]是符合要求的[{(})]这种是不符合闭合要求的
if (stk.empty() || stk.top() != pairs[ch]) {
return false;//
}
//这里相当于一个else,如果栈不为空,且现在遍历到的右括号与栈顶匹配,就把入栈的匹配的左括号出栈
stk.pop();
作者:zhang-li-bin-t
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-gua-hao-shang-lai-zi-ji-dong-by-zhan-mwn9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以下是原答案:
由于本人对栈的了解仅仅停留在push、pop以及后入先出中,所以先上官方题解。
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}//字符串长度为奇数直接返回false
//哈希表,前面是键,后面是值,构成键值对
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;//建栈
for (char ch: s) {//遍历s中的字符
if (pairs.count(ch)) {//如果哈希表中有该键
//先决判断条件:此时栈是否为空,若栈不为空,或者栈顶 不等于 哈希表的键, return false;//说明这个测试用例不正确
if (stk.empty() || stk.top() != pairs[ch]) {
return false;//说明这个测试用例不正确
}
//如果没有上述情况,出栈
stk.pop();
}
else {
stk.push(ch);//压栈
}
}
return stk.empty();
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
官方题解也看不懂
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}
unordered_map<char, char> pairs = { //建立一个哈希表,第一个char为key,第二个char为value
{')', '('}, //哈希表映射的右括号为键,左括号为值
{']', '['},
{'}', '{'}
};
stack<char> stk;
for (char ch: s) { //遍历整个字符串
if (pairs.count(ch)) { //pairs.count()用于查找键,若该键存在,则返回1,若不存在,则返回0
if (stk.empty() || stk.top() != pairs[ch]) { //检查栈中是否有括号,若有括号,检查括号类型是否相同, stk.empty()一定要先判断
return false; //若不同,则返回false
}
stk.pop(); //若相同,则将栈中的括号抛出
}
else {
stk.push(ch); //若当前的字符为左括号,则将当前字符压入栈中
}
}
return stk.empty(); //若遍历完没有false,并且栈为空,则说明有效
}
};
copy