20. 有效的括號
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
思路:
1.創建一個空數組,對字符串進行分割,對每一個字符判斷是左括號還是右括號
2.左括號進棧push
3.右括號則分情況判斷:
3.1 若棧爲空,則return false;
3.2 若棧不爲空,彈出棧頂元素:
3.2.1 若元素爲對應的左括號,return true
.2.2 否則,return false
/**
*
* @param {String} str
* @return {boolean}
*/
var isValid = function (str) {
if (!str) return true; //Note that an empty string is also considered valid.
const stack = [];
var str2Arr = str.split("");
for (let elem of str2Arr) {
switch (elem) {
case "{":
case "[":
case "(":
stack.push(elem);
break;
case "}":
if (!(stack.length && stack.pop() === "{")) {
return false;
}
break;
case "]":
if (!(stack.length && stack.pop() === "[")) {
return false;
}
break;
case ")":
if (!(stack.length && stack.pop() === "(")) {
return false;
}
break;
default:
return false;
}
}
return !stack.length;
}
擴展:
1.如果只有一種括號,則採用計數法
Problem2:921.使括號有效的最少添加
給定一個由 ‘(’ 和 ‘)’ 括號組成的字符串 S,我們需要添加最少的括號( ‘(’ 或是 ‘)’,可以在任何位置),以使得到的括號字符串有效。
從形式上講,只有滿足下面幾點之一,括號字符串纔是有效的:
它是一個空字符串,或者
它可以被寫成 AB (A 與 B 連接), 其中 A 和 B 都是有效字符串,或者
它可以被寫作 (A),其中 A 是有效字符串。
給定一個括號字符串,返回爲使結果字符串有效而必須添加的最少括號數。
Problem3: 1021. 刪除最外層的括號
有效括號字符串爲空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括號字符串,+ 代表字符串的連接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括號字符串。
如果有效字符串 S 非空,且不存在將其拆分爲 S = A+B 的方法,我們稱其爲原語(primitive),其中 A 和 B 都是非空有效括號字符串。
給出一個非空有效字符串 S,考慮將其進行原語化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括號字符串原語。
對 S 進行原語化分解,刪除分解中每個原語字符串的最外層括號,返回 S 。
2.如果有多個匹配字段,如解析HTMl或XML標記,因匹配類型過多,可以採用Map哈希表,存儲匹配類型
如:const mapper = {’{’: “}”,"[": “]”,"(": “)”};
leetCode分類刷題 該地址長期、每週更新LeetCode分類刷題
參考資料
leetcode題解