给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"输出: true
示例 2:
输入: "()[]{}"输出: true
示例 3:
输入: "(]"输出: false
示例 4:
输入: "([)]"输出: false
示例 5:
输入: "{[]}"输出: true
利用栈。
为了提高性能, 在循环前进行这一步:let len = s.length
是非常关键的,减少了计算次数。
为了提高执行时间,这一步 if (s.length % 2) return false
是非常关键的,减少了不必要的计算。
var isValid = function(s) {if (s === '') return true;if (!s.length || s.length % 2 === 1) return false;const stack = s.split(''),rightStack = [];while (stack.length) {const top = stack.pop();if (top === ')' || top === ']' || top === '}') {rightStack.push(top);continue;}const right = rightStack.pop();if ((top === '(' && right !== ')') ||(top === '[' && right !== ']') ||(top === '{' && right !== '}'))return false;}return true;};
O(n)
,因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 O(1)
的推入和弹出操作O(n)
var isValid = function(s) {if (s === '') return true;if (!s.length || s.length % 2 === 1) return false;let map = {'{': '}','(': ')','[': ']',};let stack = [];for (let i = 0; i < s.length; i++) {if (map[s[i]]) {stack.push(s[i]);} else if (s[i] !== map[stack.pop()]) {return false;}}return stack.length === 0;};
O(n)
O(n)