有效的括號
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true
採用配對的方法,首先對字符進行最簡單的長度判斷,如果不能被2整除,直接返回false;爲0直接返回true;然後循環將每個字符進棧,每個字符在進棧的時候與前一個字符進行配對,成功就將前一個字符出棧,最後判斷棧的長度。爲0說明全部配對成功。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s.length%2){
return false
}
if(s.length === 0){
return true
}
var stack = [];
stack.push(s[0])
for(let i =1;i<s.length;i++){
if(stack.length!== 0 && (stack[stack.length-1] === '(' && s[i] === ')' || stack[stack.length-1] === '{' && s[i] === '}' || stack[stack.length-1] === '[' && s[i] === ']')){
stack.pop()
}else{
stack.push(s[i])
}
}
return stack.length === 0
};
執行用時 :76 ms, 在所有 JavaScript 提交中擊敗了35.57%的用戶
內存消耗 :35.7 MB, 在所有 JavaScript 提交中擊敗了18.18%的用戶
if
判斷中添加了太多邏輯,非常耗時,採用switch語句進行改進。
改進
var isValid = function(s) {
let stack = []
let len = s.length
if (len%2) return false
for (let i = 0; i < len; i++) {
let str = s[i]
switch(str) {
case "(": {
stack.push(str)
break;
}
case "[": {
stack.push(str)
break;
}
case "{": {
stack.push(str)
break;
}
case ")": {
if (stack.pop() !== "(") return false
break;
}
case "]": {
if (stack.pop() !== "[") return false
break;
}
case "}": {
if (stack.pop() !== "{") return false
break;
}
}
}
return stack.length === 0
};
執行用時 :72 ms, 在所有 JavaScript 提交中擊敗了50.39%的用戶
內存消耗 :32.3 MB, 在所有 JavaScript 提交中擊敗了100.00%的用戶