20. 有效的括号

题目

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例

输入: "()"
输出: true

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

输入: "(]"
输出: false

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

输入: "{[]}"
输出: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14

我的方案

利用List存储首次出现的左侧符号。 遇到右侧符号时,与Lizt最后一项进行比较,不符合就返回 false 全部匹配完,返回 list的长度==0的判断值。

Java源码

public boolean isValid(String s) {
    List<Character> left = new ArrayList<>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == '[' || c == '{' || c == '(') {
            left.add(c);
        } else {
            if (left.size() == 0)
                return false;
            if (c == ']' && left.get(left.size() - 1) != '[')
                return false;
            if (c == '}' && left.get(left.size() - 1) != '{')
                return false;
            if (c == ')' && left.get(left.size() - 1) != '(')
                return false;
            left.remove(left.size() - 1);
        }
    }
    return left.size() == 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Dart源码

List<String> left = [];
  for (int i = 0; i < s.length; i++) {
    String c = s.substring(i, i + 1);
    if (c == '[' || c == '{' || c == '(') {
      left.add(c);
    } else {
      if (left.length == 0) return false;
      if (c == ']' && left[left.length - 1] != '[') return false;
      if (c == '}' && left[left.length - 1] != '{') return false;
      if (c == ')' && left[left.length - 1] != '(') return false;
      left.removeAt(left.length - 1);
    }
  }
  return left.length == 0;
1
2
3
4
5
6
7
8
9
10
11
12
13
14

推荐方案

思路类似,不过他是用数组+最后位下标配合使用

Java源码

public boolean isValid(String s) {
    char[] stack = new char[s.length()+1];
    int top = 1;
    for(char c : s.toCharArray()){
        if(c == '(' || c == '{' || c == '['){
            stack[top++] = c;
        }else if(c == ')' && stack[--top] != '('){
            return false;
        }else if(c == '}' && stack[--top] != '{'){
            return false;
        }else if(c == ']' && stack[--top] != '['){
            return false;
        }
    }
    return top == 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
最后更新时间: 10/18/2019, 11:00:50 AM