leetcode:20. 有效的括号
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例:
输入:s = "()"输出:true
输入:s = "()[]{}"输出:true
输入:s = "(]"输出:false
输入:s = "([)]"输出:false
输入:s = "([)]"输出:false
解答 & 代码
class Solution {private:// 判定传入的左括号 left 和右括号 right 的类型是否匹配bool match(char left, char right){return (left == '(' && right == ')') ||(left == '{' && right == '}') ||(left == '[' && right == ']');}public:bool isValid(string s) {stack<char> leftStack; // 存放左括号的栈// 遍历字符串 sfor(int i = 0; i < s.size(); ++i){// 如果当前是左括号,则入栈if(s[i] == '(' || s[i] == '{' || s[i] == '[')leftStack.push(s[i]);// 如果当前是右括号else{// 若栈不为空且该右括号和栈顶的左括号类型匹配,则弹出栈顶(匹配后抵消掉)if(!leftStack.empty() && match(leftStack.top(), s[i]))leftStack.pop();// 若栈为空 or 该右括号和栈顶的左括号类型不匹配,则直接返回 falseelsereturn false;}}// 如果最后栈为空,则字符串 s 是有效的,返回 true;否则还有多余的左括号,返回 falsereturn leftStack.empty();}};
复杂度分析:设字符串 s 长为 N
- 时间复杂度 O(N):遍历字符串
s的每个字符 - 空间复杂度 O(N):存放左括号的栈
leftStack,最坏情况下字符串s中每个字符都是左括号,则栈最大长度 N
执行结果:
执行结果:通过执行用时:4 ms, 在所有 C++ 提交中击败了 11.55% 的用户内存消耗:6.2 MB, 在所有 C++ 提交中击败了 63.98% 的用户
