我首先定義了一個需求字典(允許使用不同的括號),每個鍵的初始值為 0。然后我將輸入轉換為串列。然后對于串列中的每個元素,如果它作為字典中的一個鍵存在,那么該鍵的值將增加 1。最后,將比較相應的鍵值,'true' 或 'false' 將如果有相等的相應括號,則顯示 - 即如果 '(' == ')' 的數量。
class Solution:
def isValid(self, s: str) -> bool:
d = {'(': 0, ')': 0, '{': 0, '}': 0, '[': 0, ']': 0}
s = list(s)
for i in s:
if i in d.keys():
d[i] = 1
if d['('] == d[')'] and d['{'] == d['}'] and d['['] == d[']']:
return 'true'
else:
return 'false'
當 s = "(]" 時,顯示 true 而不是 false。請有人解釋為什么會發生這種情況?它似乎也只能通過 24/91 測驗用例,所以一定有一個我似乎無法發現的突出錯誤:(
uj5u.com熱心網友回復:
前言
無論此錯誤如何,您都忘記了開始時的幾個重要因素。這是一個堆疊問題,這意味著您不僅需要跟蹤它們的計數,還需要跟蹤它們的順序。看這個例子:
([)]
不僅每種型別的括號(美式括號)的數量相等,而且它們的順序也相同,即(is before)等。我們可以通過動態檢查它是否有效來解決這個問題,也就是說我們不斷地檢查它是否有效,而不是在最后運行我們所有的測驗。
規劃
我們的代碼需要做 3 個關鍵步驟:
- 設定對應詞典并創建堆疊
- 遍歷字串,在必要時添加從堆疊中移除
- 最終有效性檢查和額外回報
設定
我們需要創建一個字典來跟蹤哪個左括號對應于關閉,另一個用于關閉到打開。
然后我們需要創建一個堆疊。堆疊很重要,因為它告訴用戶必須關閉哪些括號以及以什么順序關閉。如果我們打開一個新的,我們將它添加到堆疊中。如果我們關閉一個,我們將它從堆疊中移除。請記住,我們只能關閉最后一個括號。如果沒有,那么無論如何它都是無效的。
迭代
在迭代階段,我們顯然需要遍歷字串的每個字符(可以忽略非括號字符)。
如果它在打開字典中,我們將它添加到堆疊中。如果它在封閉字典中,我們需要做更多的作業:
- 如果堆疊為空并且我們試圖洗掉一個專案,那么括號顯然是無效的。例如
()],我們無法關閉]它,因為它從未打開過。 - 如果括號是堆疊的最后一個元素,那么它是有效的,我們可以簡單地使用
pop它。 - 因此,如果它不是最后一個元素,那么它就不是一個有效的括號,我們可以回傳它。
最終檢查
由于所有先前的作業,我們只需要 1 個檢查。如果堆疊是空的,那么我們已經決議了所有的括號,否則我們還沒有。所以:
- 如果為空,回傳真
- 否則回傳false 這個可以通過
return len(stack) == 0
代碼
不要讓這看起來令人生畏,我只是添加了評論,這真的很充實。這段代碼獲得的分數大約32ms與14.4MB上LeetCode。
class Solution:
def isValid(self, string: str) -> bool:
# Setup
stack = []
opening = {"(":")","[":"]","{":"}"}
closing = {")":"(","]":"[","}":"{"}
# Closing not needed for correspondence, but
# helpful for checking if it is a closing bracket
# Iteration
for char in string:
# Opening bracket, add to list
if char in opening:
stack.append(opening[char])
# Closing bracket, extra checks
elif char in closing:
# Empty, cannot close and thus false
if len(stack) == 0:
return False
# It last element, therfore valid bracket
elif char == stack[-1]:
stack.pop()
# Not last element, invalid
else:
return False
# Final validity statement
return len(stack) == 0
原始錯誤
正如評論的那樣,您最初的錯誤部分是由于您的退貨宣告。True或False旨在作為布林值回傳,而不是字串。LeetCode 從它自己的角度清楚地解釋每個非布林值,即True(它非常敏感,你需要準確地給出它所要求的)。因此,要修復此錯誤,請嘗試以下回傳:
# Swap
return 'true'
# With
return True
# Swap
return 'false'
# With
return False
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/391728.html
