标签:i++ bool ISE 步骤 style 一点 类型 再计算 ring
原题目:
给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解题思想:
通过观察可以发现,有效的括号都至少具有一组左括号和右括号相邻的情况,然后可以将这一部分由相邻左右括号构成的子串去掉,判断剩下部分的有效性。(这一点就像自己计算数学题一样,一般都是先计算最深层的括号,然后得到数之后,再计算下一层的括号,直到最后一层),具体解题思路如下:
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 }
标签:i++ bool ISE 步骤 style 一点 类型 再计算 ring
原文地址:https://www.cnblogs.com/zhang-yi/p/12757783.html