leetcode20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
思路
由于栈结构的特殊性,非常适合做对称匹配类的题目。
首先要弄清楚,字符串里的括号不匹配有几种情况。
先来分析一下 这里有三种不匹配的情况,
- 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。如图:
- 第二种情况,括号没有多余,但是 括号的类型没有匹配上。如图:
- 第三种情况,字符串里右方向的括号多余了,所以不匹配。如图:
动画如下:
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。
C++代码
class Solution {
public:
bool isValid(string 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() && s[i] != st.top()) return false;
else st.pop(); //s[i] 与st.top() 相等,弹出
}
//情况一: 遍历完字符串后, 栈不为空,说明左括号多了, 有相应的左括号没有右括号来匹配
return st.empty();
}
};
大佬公众号:代码随想录