20. 有效的括号
链接:https://leetcode-cn.com/problems/valid-parentheses/
题目描述见链接内容。
解法
显然需要用栈解决,一开始我想用计数器的方式来解决,计数器方式的前提是这些括号可以穿插出现,那么([)]
这种形式就是合法的了,这样与题目要求不符合
在仔细观察,符号要求的括号一定是满足的条件是:如果右括号出现,那么右括号的左边必须是左括号,这样才能满足要求
有了这个条件,代码本身就不难了:
var isValid = function (s) {
const temp = [];
let start = 0;
const length = s.length;
const paddingStr = {
'}': '{',
']': '[',
')': '('
};
while (start < length) {
const current = s[start];
// 如果是左括号,那么压入栈中
if (current === '(' || current === '{' || current === '[') {
temp.push(current);
} else {
// 如果是右括号,那么要判断当前栈顶是不是对应的左括号,如果是的话,就将栈顶符号出栈
if (temp[temp.length - 1] === paddingStr[current]) {
temp.pop();
} else {
// 如果不是对应的额左括号,那么一定不是符合要求的表达式
return false;
}
}
// 继续迭代
start += 1;
}
// 符合要求的表达式,栈一定是空的
return temp.length === 0;
};
- 时间复杂度:
${O(N)}$
- 空间复杂度:
${O(N)}$
- 执行用时:84ms, 在所有JavaScript提交中击败了73%的用户,内存消耗:38MB,在所有JavaScript提交中击败了69%的用户