LeetCode

原题目:

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

有效字符串需满足:

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

解题思想:

通过观察可以发现,有效的括号都至少具有一组左括号和右括号相邻的情况,然后可以将这一部分由相邻左右括号构成的子串去掉,判断剩下部分的有效性。(这一点就像自己计算数学题一样,一般都是先计算最深层的括号,然后得到数之后,再计算下一层的括号,直到最后一层),具体解题思路如下:

1、构建右括号和左括号之间的映射;

2、建立一个栈,遍历字符串,遇到左括号将其放到栈里面,遇到右括号,根据步骤1中的映射关系,判断栈顶的括号是否与该右括号构成有效括号,如果不构成,直接返回false,如果是有效的,弹出栈顶元素,继续遍历;(栈数据结构是后进先出,因此用栈来存储已遍历的括号字符)

3、判断最终栈是否为空,如果不为空,则不是有效括号。

题解:

 1 class Solution {
 2     public static boolean isValid(String s) {
 3         HashMap<Character , Character> maps = new HashMap<>();
 4         int len = s.length();
 5         if(len % 2 != 0) return false; //长度为奇数,直接返回false
 6         maps.put(')', '(');
 7         maps.put('}', '{');
 8         maps.put(']', '[');
 9         Stack<Character> stack = new Stack<Character>();
10         for (int i = 0; i < s.length(); i++) {
11             char c = s.charAt(i);
12             if (maps.containsKey(c)) {
13                 char topElement = stack.empty() ? '#' : stack.pop();
14                 if (topElement != maps.get(c)) {
15                     return false;
16                 }
17             } else {
18                 stack.push(c);
19             }
20         }
21         return stack.isEmpty();
22     }
23 }
原文地址:https://www.cnblogs.com/zhang-yi/p/12757783.html