boxed-water-is-better-6WrKKQcEnXk-unsplash.jpg
简单给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = “()”
输出:true
示例 2:

输入:s = “()[]{}”
输出:true
示例 3:

输入:s = “(]”
输出:false
示例 4:

输入:s = “([)]”
输出:false
示例 5:

输入:s = “{[]}”
输出:true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

  1. /**
  2. * @param {string} s
  3. * @return {boolean}
  4. */
  5. var isValid = function (s) {
  6. if (s.length < 2 || s.length % 2 === 1) {
  7. return false;
  8. }
  9. const map = {
  10. "(": ")",
  11. "[": "]",
  12. "{": "}",
  13. };
  14. if (s.length === 2) {
  15. if (s[1] === map[s[0]]) {
  16. return true;
  17. }
  18. return false;
  19. }
  20. const stack = [];
  21. for (let i = 0; i < s.length; i++) {
  22. if (stack.length === 0) {
  23. stack.push(s[i]);
  24. continue;
  25. }
  26. if (map[stack[stack.length - 1]] === s[i]) {
  27. stack.pop();
  28. } else {
  29. stack.push(s[i]);
  30. }
  31. }
  32. return stack.length === 0;
  33. };

思路:使用栈

  1. 根据题意首先排除特殊情况:s.length<2 && s.length % 2 === 1,此时直接返回false;倘若s.length === 2则直接比对两个元素,根据情况返回即可;
  2. 接下来设定一个空栈stack,根据题意我们可以判断出若该字符串时有效的括号,则必然存在stack(stack.length >= 1 )的最后一位元素与 字符串s 中的某个字符组成一个合法的括号;
  3. 所以我们只需要不断地进行进栈出栈的行为,最后判断栈的长度是否为0即可。