https://leetcode-cn.com/problems/valid-parentheses/
点击查看【bilibili】

题目

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

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

示例

  1. 输入: "()"
  2. 输出: true
  1. 输入: "()[]{}"
  2. 输出: true
  1. 输入: "(]"
  2. 输出: false
  1. 输入: "([)]"
  2. 输出: false
  1. 输入: "{[]}"
  2. 输出: true

解答

1创建一个 HashMap,把括号配对放进去。
2.创建一个 stack(array)栈,for循环遍历字符串,
对于每一个字符,如果map里有这个key,那说明它是个左括号,
从map里取得相对应的右括号(为什么?),把它push进stack里。
否则的话,它就是右括号
需要pop出 stack里的第一个字符(也就是数组的最后一个字符)
然后看它是否等于当前的字符。如果不相符,则返回false
3.循环结束后如果stack不为空,说明还剩一些左括号没有被闭合,返回false.否则返回true
image.png
image.png

答案

  1. /**
  2. * @param {string} s
  3. * @return {boolean}
  4. */
  5. var isValid = function(s) {
  6. // 创建map,把括号匹配放进去,作为key,value
  7. const mappings = new Map()
  8. mappings.set('(',')');
  9. mappings.set('[',']');
  10. mappings.set('{','}');
  11. const stack = [] // 创建栈
  12. for(let i=0;i<s.length;i++) {
  13. // 如果map中有s[i],也就是有字符串中有左括号,把它对应的value放到stack中
  14. if(mappings.has(s[i])) {
  15. stack.push(mappings.get(s[i]))
  16. // 否则就是右括号,
  17. }else {
  18. // 如果pop出的字符不等于当前字符,说明右括号不匹配
  19. if(stack.pop() != s[i]) {
  20. return false
  21. }
  22. }
  23. }
  24. // 如果stack不为空,说明有一些左括号没有闭合,返回false
  25. if(stack.length !== 0) {
  26. return false
  27. }
  28. return true
  29. };