[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]
生活随笔
收集整理的這篇文章主要介紹了
[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[中等]
【解答思路】
1. 棧
如果是一個合法的括號序列,遍歷到一個右括號(i)時,那么它的前一個括號(i-1)必定是它的另一半(左括號)。反之不是它的另一半或者前面沒有括號時,那這個序列必定是非法括號序列。
思路:利用一個stack輔助保存括號,遇見左括號時入棧對應的右括號,遇到右括號時
- ???#xff0c;證明前面沒有匹配括號 多余的右括號
- 棧非空彈出棧頂元素進行比較操作
最后判斷棧是否為空 - 空 括號匹配
- 非空 多余的左括號
要么在入棧時根據不同類別入棧右括號 要么出棧的時候根部不同類別作判斷 至少進行一次分類討論
時間復雜度:O(N) 空間復雜度:O(N)
借助棧,對字符串進行字符遍歷,如果字符是左括號,則入棧,左括號為’(’,’{’,’[’,如果字符是右括號,則出棧,并將右括號與左括號聯合比較,判斷是否可以組成有效的括號,有效括號是"()","{}","[]",如果不能組成,則返回錯誤
class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '{' || c == '(' || c == '[') {stack.push(c);} else {char p = stack.empty() ? '\0' : stack.pop();if ((c == '}' && p != '{') || (c == ']' && p != '[')|| (c == ')' && p != '(')) {return false;}}}return stack.empty();} }2. HashMap
時間復雜度:O(N) 空間復雜度:O(1)
public boolean isValid(String s) {if (s == null) {// 如果輸入字符為空沒有必要繼續下去,直接返回falsereturn false;}int len = s.length();if (len % 2 != 0) {// 如果長度為奇數,必然至少有一個括號沒有匹配return false;}Map<Character, Character> pairs = new HashMap<>();pairs.put(')', '(');pairs.put(']', '[');pairs.put('}', '{');Deque<Character> stack = new LinkedList<>();for (int i = 0; i < len; i++) {char current = s.charAt(i);if (pairs.containsKey(current)) {// 如果棧已經為空了,說明右括號比左括號多,不匹配,直接返回false// 當第一次出現右括號的時候, 棧頂元素必然為左括號,不然不匹配,直接返回falseif (stack.isEmpty() || stack.peek() != pairs.get(current)) {return false;}stack.pop();} else {stack.push(current);}}// 如果最后棧不為空,說明左括號多于右括號,不匹配,返回falsereturn stack.isEmpty(); }【總結】
1. 優化
1.1 判斷長度為奇數時 直接返回錯誤
1.2 使用Deque 代替 stack
stack在基于數組實現上效率低 擴容效率低
1.3 字符串轉z字符數組遍歷 速度較快
String s; char[] ch=s.toCharArray();2.Deque
參考文章:https://www.cnblogs.com/lxyit/p/9017350.html
總結
以上是生活随笔為你收集整理的[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改Eclipse字体以及背景颜色
- 下一篇: CentOS查看和修改PATH环境变量的