title: leetcode-20-有效的括号
date: 2019-09-05 19:06:51
categories:
- leetcode
tags: - leetcode
有效的括号
-
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。示例 1:
输入: “()”
输出: true
示例 2:输入: “()[]{}”
输出: true
示例 3:输入: “(]”
输出: false
示例 4:输入: “([)]”
输出: false
示例 5:输入: “{[]}”
输出: true来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 -
解法:使用hashmap,]–>[;}–>{?—>(,但是栈的底部默认要加上一个!或者其他特殊符号,防止栈为空,抛异常
class Solution { //匿名内部类:用两个大括号初始化,本质上就是匿名内部类+实例化代码块 private static final Map<Character,Character> MAP = new HashMap<Character, Character>(){{ put(')','('); put('}','{'); put(']','['); } }; public static boolean isValid(String s) { Stack<Character> stack = new Stack<Character>(); for (char c:s.toCharArray()) { if(MAP.containsKey(c)) { char topChar = stack.isEmpty() ? '!' : stack.pop(); if (topChar!=MAP.get(c)){ return false; } }else { stack.push(c); } } return stack.isEmpty(); } }
-
对上述代码进行优化,来自别人代码–让我很受启发
class Solution { public boolean isValid(String s) { char[] nums = s.toCharArray(); char[] numb = new char[s.length()]; int top = -1; for (int i=0;i<nums.length;i++){ if(top!=-1){ if(numb[top]=='('&&nums[i]==')') top -=1; else if(numb[top]=='{'&&nums[i]=='}') top -=1; else if(numb[top]=='['&&nums[i]==']') top -=1; else numb[++top] = nums[i]; }else{ numb[++top] = nums[i]; } } return top==-1; } }