给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true

遍历给定的字符串 ,当遇到一个左括号时,会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此可以将这个左括号放入栈顶。
当遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串无效。
为了快速判断括号的类型,可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。
public boolean isValid(String s) {Map<Character, Character> map = new HashMap<>();map.put(')', '(');map.put('}', '{');map.put(']', '[');Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 若遇到右括号 弹出栈顶元素,进行比较,反之入栈if (map.containsKey(c)) {char topElement = stack.empty() ? '#' : stack.pop();// 若栈顶元素和右括号对应的左括号类型不匹配,则不是有效括号字符串if (topElement != map.get(c)) {return false;}} else {stack.push(c);}}return stack.isEmpty();}
优化一下:可以提前判断一下字符串长度,如果是奇数,那么必定不是有效括号字符串
public boolean isValid(String s) {// 奇数长度必定不是有效括号字符串if (s.length() % 2 == 1) {return false;}Map<Character, Character> map = new HashMap<>();map.put(')', '(');map.put('}', '{');map.put(']', '[');Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 若遇到右括号 弹出栈顶元素,进行比较,反之入栈if (map.containsKey(c)) {char topElement = stack.empty() ? '#' : stack.pop();// 若栈顶元素和右括号对应的左括号类型不匹配,则不是有效括号字符串if (topElement != map.get(c)) {return false;}} else {stack.push(c);}}return stack.isEmpty();}
