有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 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.遍历完了 :
若栈不为空,说明左括号多了
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(); } };