20 有效的括号
题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
来源:力扣(LeetCode)
链接: link.
思路
先将输入的左括号对应的右括号按顺序推进栈 st 里,然后再将输入的右括号与栈 st 里按出栈顺序一一比较.
若相同则说明匹配成功,从栈里删除该括号,这样输入完成后栈也清空了,字符串有效;
其他情况字符串无效 :
1.遍历中途,遇到这两种情况就可以做出无效判断(提前退出,因为继续下去也不可能有效) :
若 st 为空,说明右括号多了;若栈顶括号与输入右括号不同,说明不匹配;
2.遍历完了 :
若栈不为空,说明左括号多了
具体代码实现(C++)
class Solution {
public:
bool isValid(string s) {
stack<int> 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(']');
else if (st.empty() || st.top() != s[i]) //1.没遍历完就为空,说明右括号多了;2.左右括号不匹配
return false;
else
st.pop();
}
//3.左括号多了
return st.empty();
}
};