## 题目地址 https://leetcode.com/problems/valid-parentheses/description ## 题目描述 ``` Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. An input string is valid if: Open brackets must be closed by the same type of brackets. Open brackets must be closed in the correct order. Note that an empty string is also considered valid. Example 1: Input: "()" Output: true Example 2: Input: "()[]{}" Output: true Example 3: Input: "(]" Output: false Example 4: Input: "([)]" Output: false Example 5: Input: "{[]}" Output: true ``` ## 思路 关于这道题的思路,邓俊辉讲的非常好,没有看过的同学可以看一下,[视频地址](http://www.xuetangx.com/courses/course-v1:TsinghuaX+30240184+sp/courseware/ad1a23c053df4501a3facd66ef6ccfa9/8d6f450e7f7a445098ae1d507fda80f6/)。 使用栈,遍历输入字符串 如果当前字符为左半边括号时,则将其压入栈中 如果遇到右半边括号时,分类讨论: 1)如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环 2)若此时栈为空,则直接返回 false 3)若不为对应的左半边括号,反之返回 false ![20.validParentheses](../assets/20.validParentheses.gif) (图片来自: https://github.com/MisterBooo/LeetCodeAnimation) > 值得注意的是,如果题目要求只有一种括号,那么我们其实可以使用更简洁,更省内存的方式 - 计数器来进行求解,而 不必要使用栈。 > 事实上,这类问题还可以进一步扩展,我们可以去解析类似 HTML 等标记语法, 比如

## 关键点解析 1. 栈的基本特点和操作 2. 如果你用的是 JS 没有现成的栈,可以用数组来模拟 入: push 出:pop > 入: push 出 shift 就是队列 ## 代码 * 语言支持:JS,Python Javascript Code: ```js /** * @param {string} s * @return {boolean} */ var isValid = function(s) { let valid = true; const stack = []; const mapper = { '{': "}", "[": "]", "(": ")" } for(let i in s) { const v = s[i]; if (['(', '[', '{'].indexOf(v) > -1) { stack.push(v); } else { const peak = stack.pop(); if (v !== mapper[peak]) { return false; } } } if (stack.length > 0) return false; return valid; }; ``` Python Code: ``` class Solution: def isValid(self,s): stack = [] map = { "{":"}", "[":"]", "(":")" } for x in s: if x in map: stack.append(map[x]) else: if len(stack)!=0: top_element = stack.pop() if x != top_element: return False else: continue else: return False return len(stack) == 0 ``` ## 扩展 如果让你检查 XML 标签是否闭合如何检查, 更进一步如果要你实现一个简单的 XML 的解析器,应该怎么实现?