【问题描述】 20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。示例 1:输入: "()"
输出: true来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
【解答思路】
1. 时间复杂度:O(N) 空间复杂度:O(N)
public boolean isValid(String s) {char[] symbol=s.toCharArray();Stack<Character> stack=new Stack<Character>();Map<Character,Character> map=new HashMap<Character,Character>(){{put('(',')');put('[',']');put('{','}');}};for (char c:symbol){if (c=='(' || c=='[' || c=='{')stack.push(c); //这里自动装箱,并压入栈中elseif (!stack.empty() && c==map.get(stack.peek())){stack.pop();continue;}else if (!stack.empty() && c!=map.get(stack.peek())) //stack栈不为空(避免找栈顶报错)且括号不匹配return false;else //stack栈为空,但有反括号return false;}if (stack.empty()) //因为可能出现((((({{{{{{[[[[这种无反括号情况return true;elsereturn false;}
}
2.非Map +栈 时间复杂度:O(N) 空间复杂度:O(N)
public boolean isValid(String s) {if(s.isEmpty())return true;Stack<Character> stack=new Stack<Character>();for(char c:s.toCharArray()){if(c=='(')stack.push(')');else if(c=='{')stack.push('}');else if(c=='[')stack.push(']');else if(stack.empty()||c!=stack.pop())return false;}if(stack.empty())return true;return false;}
3.Map +数组 时间复杂度:O(N) 空间复杂度:O(N)
class Solution {public boolean isValid(String s) {//Object put(Object key, Object value): 向集合中加入元素Map<Character,Character> charMap = new HashMap<>();charMap.put(')', '(');charMap.put('}', '{');charMap.put(']', '[');char []stack = new char[s.length()];int top = -1;for(int i = 0 ; i < s.length() ; i++){if(charMap.containsValue(s.charAt(i))) {stack[++top] = s.charAt(i);}if(charMap.containsKey(s.charAt(i))) {//Object get(Object key): 获得与关键字key相关的值if( top == -1 || stack[top--] != charMap.get(s.charAt(i))) {return false;}}}return top == -1;} }
【总结】
1.括号匹配->栈 Stack
2. Map 的常用方法:
1 添加,删除操作:Object put(Object key, Object value): 向集合中加入元素Object remove(Object key): 删除与KEY相关的元素void putAll(Map t): 将来自特定映像的所有元素添加给该映像void clear(): 从映像中删除所有映射2 查询操作:Object get(Object key): 获得与关键字key相关的值
- Stack 的常用方法:
push( num) 入栈
pop() 栈顶元素出栈
empty() 判定栈是否为空
peek() 获取栈顶元素
search(num) 判端元素num是否在栈中,如果在返回1,不在返回-1。 注意pop()和peek()的区别。pop()会弹出栈顶元素并返回栈顶的值,peek()只是获取栈顶的值,但是并不会把元素从栈顶弹出来