题目描述:给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。

    有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。

    示例 1: 输入: “()” 输出: true

    示例 2: 输入: “()[]{}” 输出: true

    示例 3: 输入: “(]” 输出: false

    示例 4: 输入: “([)]” 输出: false

    示例 5: 输入: “{[]}” 输出: true

    思路:题目中若涉及括号问题,则很有可能和栈相关。
    我们的思路就是在遍历字符串的过程中,往栈里 push 括号对应的配对字符。比如如果遍历到了 (,就往栈里 push )

    1. // 用一个 map 来维护左括号和右括号的对应关系
    2. const leftToRight = {
    3. "(": ")",
    4. "[": "]",
    5. "{": "}"
    6. };
    7. /**
    8. * @param {string} s
    9. * @return {boolean}
    10. */
    11. const isValid = function(s) {
    12. // 结合题意,空字符串无条件判断为 true
    13. if (!s) {
    14. return true;
    15. }
    16. // 初始化 stack 数组
    17. const stack = [];
    18. // 缓存字符串长度
    19. const len = s.length;
    20. // 遍历字符串
    21. for (let i = 0; i < len; i++) {
    22. // 缓存单个字符
    23. const ch = s[i];
    24. // 判断是否是左括号,这里我为了实现加速,没有用数组的 includes 方法,直接手写判断逻辑
    25. if (ch === "(" || ch === "{" || ch === "[") stack.push(leftToRight[ch]);
    26. // 若不是左括号,则必须是和栈顶的左括号相配对的右括号
    27. else {
    28. // 若栈不为空,且栈顶的左括号没有和当前字符匹配上,那么判为无效
    29. if (!stack.length || stack.pop() !== ch) {
    30. return false;
    31. }
    32. }
    33. }
    34. // 若所有的括号都能配对成功,那么最后栈应该是空的
    35. return !stack.length;
    36. };