[英]Can someone explain to me the logic of the last part of this code?
我在做hackerrank,我試圖理解RodneyShag寫的解決方案。 (信用:他寫了解決方案,而不是我)我試圖理解最后一部分。
import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayDeque;
class Solution {
public static void main(String[] args) {
/* Create HashMap to match opening brackets with closing brackets */
HashMap<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
/* Test each expression for validity */
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
String expression = scan.next();
System.out.println(isBalanced(expression, map) ? "true" : "false" );
}
scan.close();
}
private static boolean isBalanced(String expression, HashMap<Character, Character> map) {
if ((expression.length() % 2) != 0) {
return false; // odd length Strings are not balanced
}
ArrayDeque<Character> deque = new ArrayDeque<>(); // use deque as a stack
for (int i = 0; i < expression.length(); i++) {
Character ch = expression.charAt(i);
if (map.containsKey(ch)) {
deque.push(ch);
} else if (deque.isEmpty() || ch != map.get(deque.pop())) {
return false;
}
}
return deque.isEmpty();
}
}
解釋(由他提供)是
我們的 map 只有 3 個鍵: (, [, { linemap.containsKey(ch) 檢查它是否是上述鍵之一,如果是,則將其推送到雙端隊列。
deque.isEmpty() || ch.= map.get(deque.pop())
檢查我們是否有一個有效的表達式。 由於此時,我們知道字符不是 (、[ 或 {,所以我們必須有一個有效的右大括號。如果
1)我們的雙端隊列是空的,我們只是讀取了一個右大括號,然后我們有一個無效的表達式(並返回 false)
2)如果右大括號與我們從雙端隊列中彈出的左大括號不匹配,那么我們有一個無效的表達式(並返回 false)
我知道Character ch = expression.charAt(i);
應該是:檢查表達式中的每個變量是否 = 到 map 字符中的變量。
為什么只有([{
在 map 中?map 中沒有( ) [ ] { }
嗎?
map 用於指定在給定左括號的情況下哪個字符是右括號。 所以當你寫
map.get('(')
你得到的字符)
定義為
map.put('(', ')');
在初始化。
ch.= map.get(deque.pop())
行檢查的是字符ch
是否是基於堆棧頂部值的預期右括號。 為了使其更清晰/更詳細, else if()
部分可以重寫為:
if (map.containsKey(ch)) {
deque.push(ch);
} else {
// 'ch' must be one of ), ] or } (or something completely different) at this point
if (deque.isEmpty()) {
// stack is empty, but shouldn't, so return false
return false;
}
Character lastOpeningBracket = deque.pop(); // is one of (, [ or {
Character expectedClosingBracket = map.get(lastOpeningBracket); // is one of ), ] or }
Character actualReadCharacter = ch; // only for verbosity
if (!expectedClosingBracket.equals(actualReadCharacter)) {
System.out.println("The character "+actualReadCharacter+" was read from\n"+
"the string, but it should be\n"+
"a "+expectedClosingBracket+" character\n"+
"because the last opening bracket was\n"+
"a "+lastOpeningBracket); // only for verbosity
return false;
}
}
(注意比較char
和Character
,請參閱@matt 的評論以及Java 中 == 和 equals() 之間的區別是什么?同時檢查可能在此處使用的Character
緩存)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.