LeetCode简单20题 有效的括号 解题思路
首先让我们看一下题目
刚开始拿到这个题目,我的思路很明确。就是计数,三种不同类型的括号分别计数。如果存在一个左小括号,则minnum+1,如果存在一个中小括号,则midnum+1,如果存在一个左大括号,则largenum+1;反之就-1;中途加上判断,如果某一时刻的num出现了负数,则判定为false。最后判断三个计数器,如果不都为0,则判定为false。
初始代码如上,但是最后的结果emm
可以发现如果仅计数的话很难去判定像上述输入的情况,那么这种时候如果继续坚持这个思路的话,这个代码逻辑就会很复杂很难。
所以我们考虑使用一种新的数据结构来解决这个问题。
栈
那么,我们需要来重新分析一下可能出现错误的情况。
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。
分析完之后,代码其实就比较好写了,
但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了
最后实现的代码如下:
// bool isValid(string s) {
if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') st.push(')');
else if (s[i] == '{') st.push('}');
else if (s[i] == '[') st.push(']');
// 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
// 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
else if (st.empty() || st.top() != s[i]) return false;
else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
}
// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return st.empty();
}
最后提交结果如上
需要注意的点
1.判断字符相等时,要用单引号,而不是双引号,笔者在这里就犯了错,找了很久也没有找到错在哪里
2.注意各种数据结构的使用。