题目描述

题目链接:https://leetcode-cn.com/problems/valid-parentheses/submissions/

题目要求:

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

输入: "()[]{}"
输出: true

输入: "(]"
输出: false

输入: "([)]"
输出: false

输入: "{[]}"
输出: true


解题思路

思路就是当左括号时, 存入栈中, 遍历到右括号的时候我们检查栈顶元素是不是对应左括号即可, 如果是就弹出, 不是直接返回false
注意右括号多出来的情况要特判一下, 也就是当遍历右括号时,如果栈内为空,则直接false.
最后直接返回stack.isEmpty()即可.

复杂度分析

T: O(n)
S: O(n)

代码

  • 代码1, 正常代码

    class Solution {
      public boolean isValid(String s) {
          Stack<Character> stack = new Stack<>();
          for (int i = 0; i < s.length(); i++) {
              if (s.charAt(i)=='(' || s.charAt(i)=='{' || s.charAt(i) == '[') {
                  stack.push(s.charAt(i));
              } else {
                  if (stack.isEmpty()) {
                      return false;
                  }
                  if (s.charAt(i) == ')' && stack.peek() == '(') stack.pop();
                  else if (s.charAt(i) == ']' && stack.peek() == '[') stack.pop();
                  else if (s.charAt(i) == '}' && stack.peek() == '{') stack.pop();
                  else return false;
              }
          }
          return stack.isEmpty();
      }
    }
  • 代码2, 存入左括号时直接存入对应右括号,逻辑更清晰

    class Solution {
      public boolean isValid(String s) {
          Stack<Character> stack = new Stack<>();
          for (int i = 0; i < s.length(); i++) {
              if (s.charAt(i) == '(') stack.push(')');
              else if (s.charAt(i) == '[') stack.push(']');
              else if (s.charAt(i) == '{') stack.push('}');
              else if (s.charAt(i) == '}' || s.charAt(i) == ']' || s.charAt(i) == ')') {
                  if (!stack.isEmpty() && stack.peek() == s.charAt(i)) {
                      stack.pop();
                  } else {
                      return false;
                  }
              }
          }
          return stack.isEmpty();
      }
    }