1. 程式人生 > >LeetCode javascript解題心得 第20題 有效的括號

LeetCode javascript解題心得 第20題 有效的括號

題目如下:

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

有效字串需滿足:

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

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

示例 1:

輸入: "()"
輸出: true

示例 2:

輸入: "()[]{}"
輸出: true

示例 3:

輸入: "(]"
輸出: false

示例 4:

輸入: "([)]"
輸出: false

示例 5:

輸入: "{[]}"
輸出: true

解題思路:

拿到題目的第一反應就是堆疊出棧,那麼javascript是否也有相關的函式呢,去找了找,的確是有的;

var isValid = function (s) {
    var stack = [];                  首先我們先建立一個空的棧斷;
    var len = s.length;           獲取括號字元的長度
    for (var i = 0; i < len; i++) {
        var char = s.charAt(i);   charAt()函式是返回單個字元,i就表示第幾個,開始是0
        var stackLen = stack.length;
        if (stackLen == 0) stack.push(char);    如果棧空就壓入棧中
        else {
            if (isMatch(stack[stackLen - 1], char)) stack.pop();      如果和棧中最後一個字元匹配,那麼出棧,isMatch函式在下面有定義
            else {
                if (!isValidChar(char) || stackLen > (len - i - 2)) return false;        這個地方比較經典,棧中字元超過剩餘字元直接判負,因為絕對不可能匹配了,n個棧中括號至少需要n個剩餘括號去匹配,不難理解。
                stack.push(char);
            }
        }
    }
    return stack.length == 0;
};

function isMatch(char1, char2) {                   括號匹配函式
    if ((char1 == '(' && char2 == ')') ||
        (char1 == '{' && char2 == '}') ||
        (char1 == '[' && char2 == ']'))
        return true;
    else
        return false;
}

function isValidChar(char) {                   判斷符號的格式是否正確
    //only '(', '{' and '[' can be pushed in
    if (char == '(' || char == '{' || char == '[') return true;
    else return false;
}