leetcode20 有效的括號 javascript解題

本題連接 leetcode-cn.com/problems/va…
這道題要用到棧這個數據結構去解題。有小括號,中括號和大括號三種括號,每種括號有左和右兩種形態,左右括號要匹配才合法。咱們的思路以下步驟:程序員

  • 把字符串中的括號依次入棧,若是是左括號就正常入棧,若是是右括號,就要和前一個入棧的左括號去作比較。因此第一個入棧的是右括號的話確定返回false。
  • 若是不是同一類型的括號,不能匹配,就直接返回false。
  • 若是都是同一類型的括號,就能夠匹配,那麼這一對匹配了的括號就出棧。
  • 繼續入棧括號,按照上面的規則去作匹配,直到最後一個括號入棧完。
  • 若是全部的括號都匹配了且最後棧裏面的元素爲空,那麼就返回true,其餘狀況都返回false。

分析一下時間複雜度,每個元素都要入棧一次,因此時間複雜度是o(n)算法

思路理清楚了,咱們開始寫代碼:bash

var isValid = function(s){
    let stack = [];
    for(let item of s){
        // 左括號正常入棧
        if(item === '(') stack.push(')');
            else if(item === '[') stack.push(']');
            else if(item === '{') stack.push('}');
        else {  // 右括號
            // 第一個字符就是右括號的狀況
            if (stack.length === 0) return false ;
            // 棧頂的左括號與右括號作匹配
            if (stack.pop() !== item) return false;
        }
    }
    // 最後棧裏的元素要爲空才返回true
    return !stack.length;
}
複製代碼

最終順利經過,一樣的思路,咱們換一種寫法:數據結構

var isValid = function(s){
    let stack = [];
    let map = {
        '(':')',
        '[':']',
        '{':'}'
    };
    for( let i=0; i<s.length; i++ ){
        let cur = s[i];
        if(map[stack[stack.length - 1]] === cur) stack.pop();;
        else stack.push(cur);
    }
    return !stack.length;
}
複製代碼

第二種方法是社區大佬寫的,很是巧妙。用一個對象將配對的括號經過鍵值對存儲起來,讓代碼更簡潔,小弟現階段只能仰望。ui

總結

作算法題必定要先把思路理順了再去寫,作這道題加寫這篇文章我整整花了兩個多小時,就是由於一拿到題就開始寫,沒有去分析,中間浪費了大量的時間在發呆、迷茫上面。leetcode真恐怖,這還只是簡單難度,兩天作一道leetcode可能要成爲一個flag了。作一個程序員真難🙂spa

相關文章
相關標籤/搜索