我是 Hacker Rank 的新手,我目前正在解決 java 堆疊中的問題,我試圖解決這個演算法:
如果滿足以下條件,則僅包含括號的字串是平衡的:1. 如果它是空字串 2. 如果 A 和 B 正確,AB 正確, 3. 如果 A 正確,(A) 和 {A} 和 [ A] 也是正確的。
一些正確平衡的字串的示例是:“{}()”、“[{()}]”、“({()})”
一些不平衡字串的示例是:“{}(”、“({)}”、“[[”、“}{”等。
給定一個字串,判斷它是否平衡。
我發現了以下一種我無法理解的班輪解決方案,有人可以解釋一下嗎?
class Solution{
public static void main(String []argh)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String input=sc.next();
while(input.length() != (input = input.replaceAll("\\(\\)|\\[\\]|\\{\\}", "")).length());
System.out.println(input.isEmpty());
}
}
}
uj5u.com熱心網友回復:
"\\(\\)|\\[\\]|\\{\\}"給定的字串replaceAll是一個正則運算式。需要一半的反斜杠,因為它們()[]{}在正則運算式中都有特殊含義;需要另一半來轉義那些反斜杠,因為\在字串中也具有特殊含義。
忽略反斜杠,模式是()|[]|{},它將匹配任何子字串(),[]和{}。然后,該replaceAll呼叫通過將它們替換為空字串來洗掉所有匹配項""。然后重復此操作,直到無法替換更多匹配項。
在平衡弦上,并且僅在平衡弦上,這最終會通過從內向外移除空對來產生空弦。讓我們看一個例子:
[{()}]()[{}]
^^ ^^ ^^ <- these matches are removed
[{}][]
^^ ^^ <- then these are removed
[]
^^ <- and finally this one
while回圈的撰寫方式還有一些混淆:
while(input.length() != (input = input.replaceAll(...)).length());
要理解這一點,您需要知道=執行分配,但也評估分配的值。而且您需要知道 Java總是從左到右計算子運算式。
所以首先,input.length()被評估,產生原始字串的長度。然后(input = input.replaceAll(...)).length()被評估,它做了兩件事:它將下一個字串分配給input,并回傳下一個字串的長度。
最后,比較兩個長度。如果相等,則回圈終止,因為無法替換任何內容。如果不相等,則意味著某些匹配對已被洗掉,我們將進行另一次迭代,現在使用 的新值input。
最后,我們只檢查結果字串是否為空:
System.out.println(input.isEmpty());
uj5u.com熱心網友回復:
replaceAll 方法需要 2 個引數(正則運算式,替換);你需要了解正則運算式:
\\無論開始是什么意思
。(\\)開始必須是'(' ,結束必須是')'它們之間的任何東西,就像從正則運算式中休息一樣。
解決方案是用空字串替換正則運算式。
所以如果你的input = (1,2)3(它會在更換后3(
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453740.html
