题目
标题题
- 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
对于没有闭合的左括号而言,越靠后的左括号,对应的右括号越靠前。这满足后进先出,考虑用栈解答
解题步骤
- 新建一个栈
- 扫描字符串,遇左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定不合法。
- 最后栈空了就合法,否则不合法
方案一
var isValid = function (s) {
if (s.length % 2 === 1) { return false; }
const stack = [];
for (let i = 0; i < s.length; i++) {
const c = s[i];
if (c === '(' || c === '{' || c === "[") {
stack.push(c);
} else {
const t = stack[stack.length - 1];
if (
(t === '(' && c === ')') ||
(t === '{' && c === '}') ||
(t === '[' && c === ']')
) {
stack.pop();
} else {
return false
}
}
}
return stack.length === 0;
}
isValid('()')
复杂度
时间复杂度O(n)
空间复杂度O(n)
方法二
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if (s.length % 2 === 1) { return false; }
const stack = [];
const map = new Map();
map.set('(', ')');
map.set('{', '}');
map.set('[', ']');
for (let i = 0; i < s.length; i += 1) {
const c = s[i];
if (map.has(c)) {
stack.push(c);
} else {
const t = stack[stack.length - 1];
if ( map.get(t) === c) {
stack.pop();
} else {
return false;
}
}
}
return stack.length === 0;
};
//时间复杂度O(n)
//空间复杂度O(n)