给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
思路:
括号配对问题想到利用一个辅助栈。利用栈后进先出的特性来控制括号匹配的顺序。
- 遇到一个左括号就把对应的右括号压入栈。
- 遇到右括号时判断当前栈是否为空,为空说明在此之前没有和这个右括号配对的左括号,直接返回false。或者这个右括号不等于栈顶元素,说明括号的匹配顺序不正确,也返回false。
- 遍历一遍之后,判断栈中元素是否全部弹出,栈为空即所有的左括号都有正确的右括号匹配。返回true,否则返回false。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let stack = [];
for(let i = 0;i<s.length;i++){
if(s[i] == '(') stack.push(')');
else if(s[i] == '[') stack.push(']');
else if(s[i] == '{') stack.push('}');
else if(stack.length == 0 || s[i] !== stack.pop()) return false;
}
return stack.length == 0;
};
复杂度分析
- 时间复杂度 O(N):正确的括号组合需要遍历 1 遍 s;
- 空间复杂度 O(N):哈希表和栈使用线性的空间大小。