每天一道算法題(二十)

有效的括號

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字符串可被認爲是有效字符串。

示例 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%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章