日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第20题][JAVA][有效的括号][栈][HashMap] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[中等]

【解答思路】

1. 棧

如果是一個合法的括號序列,遍歷到一個右括號(i)時,那么它的前一個括號(i-1)必定是它的另一半(左括號)。反之不是它的另一半或者前面沒有括號時,那這個序列必定是非法括號序列。
思路:利用一個stack輔助保存括號,遇見左括號時入棧對應的右括號,遇到右括號時

  • ???#xff0c;證明前面沒有匹配括號 多余的右括號
  • 棧非空彈出棧頂元素進行比較操作
    最后判斷棧是否為空
  • 空 括號匹配
  • 非空 多余的左括號

要么在入棧時根據不同類別入棧右括號 要么出棧的時候根部不同類別作判斷 至少進行一次分類討論
時間復雜度:O(N) 空間復雜度:O(N)

優秀代碼 class Solution {public boolean isValid(String s) {int len = s.length();if (s == null || len == 0) return true;if (len % 2 != 0) {// 如果長度為奇數,必然至少有一個括號沒有匹配return false;}Deque<Character> stack = new ArrayDeque<>();for (char ch : s.toCharArray()) {if (ch == '(') {stack.addLast(')');} else if (ch == '[') {stack.addLast(']');} else if (ch == '{') {stack.addLast('}');} else if (stack.isEmpty() || stack.removeLast() != ch) {return false;}}return stack.isEmpty();} } public boolean isValid(String s) {if(s.isEmpty())return true;Stack<Character> stack=new Stack<Character>();int n = s.length();for(int i = 0;i<n;i++){char a = s.charAt(i);if(a=='(')stack.push(')');else if(a=='{')stack.push('}');else if(a=='[')stack.push(']');else{if(stack.isEmpty()||stack.pop()!=a ){return false;}}}return stack.isEmpty();}

借助棧,對字符串進行字符遍歷,如果字符是左括號,則入棧,左括號為’(’,’{’,’[’,如果字符是右括號,則出棧,并將右括號與左括號聯合比較,判斷是否可以組成有效的括號,有效括號是"()","{}","[]",如果不能組成,則返回錯誤

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在基于數組實現上效率低 擴容效率低

初始化 Deque<Character> stack = new ArrayDeque<>(); Deque<Character> stack = new LinkedList<>();

1.3 字符串轉z字符數組遍歷 速度較快

String s; char[] ch=s.toCharArray()
2.Deque

參考文章:https://www.cnblogs.com/lxyit/p/9017350.html

總結

以上是生活随笔為你收集整理的[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。