给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
题目有三种不匹配的情况:
1.存在左括号多余 -> 栈里面存在多余的右括号
2.括号没有多余,但括号的类型匹配不上
3.右括号多于左括号 -> 栈为空了但字符串尚未遍历结束
class Solution {
public:
bool isValid(string s) {
stack<char> st;
if(s.size() % 2 != 0) return false; // s为奇数一定不匹配
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('}');
else if(st.empty() || st.top() != s[i]){ // 这里处理了第二、第三种情况
return false;
}
else st.pop(); // 遍历到了右括号并且和栈顶元素相同就弹出
}
return st.empty(); // 处理第一种情况
}
};