嘿,所以我正在嘗試撰寫一個代碼來告訴我字串是否有效。一個有效的字串是一個包含相同數量的“(”和“)”的字串,例如每個“(”必須被一個“)”關閉
'((()()))' 這是一個有效的字串。這不是')('
這是我到目前為止所寫的:
def is_valid_paren(s, cnt=0):
if s == "":
return True
if "(" in s:
cnt = 1
if ")" in s:
cnt -= 1
return is_valid_paren(s[1:])
它沒有給出正確的輸出
"(.(a)"
還為
"p(()r((0)))"
它為什么有時會起作用?哦,還有一件事只能通過遞回來解決(在任何地方都不使用回圈)
uj5u.com熱心網友回復:
雖然我不明白你為什么要用遞回來解決這個問題(在這種情況下這是非常不自然的),但這是一個遞回解決方案:
def is_valid(s):
def _is_valid(s, idx):
if idx == len(s): return 0
if s[idx] == '(': return _is_valid(s, idx 1) 1
if s[idx] == ')': return _is_valid(s, idx 1) - 1
return _is_valid(s, idx 1)
return _is_valid(s, 0) == 0
uj5u.com熱心網友回復:
您可以向下傳遞未決孔徑的計數(即未閉合括號的數量),并檢查計數是否低于 0(閉包過多),以及它是否在結束時回傳零:
def validPar(s,count=0):
if count<0 : return False # too many closing
if not s: return count == 0 # must balance pending apertures
return validPar(s[1:],count (-1,1)[s[0]=="("]) # pass down count /- 1
print(validPar('((()()))')) # True
uj5u.com熱心網友回復:
遞回
迭代可能是解決此問題的最佳方法,但遞回也有效。為了遞回解決這個問題,我們需要一個檢查每個計數的系統,如果在任何階段計數低于零,括號將無效,因為右括號多于左括號。這就是困難部分發揮作用的地方:我們需要一些方法不僅可以回傳計數,還需要回傳過去的計數是否有效,因此我們將不得不使用return count, validand 之類的變數回傳和保存count, valid = is_valid_parentheses(s[1:])。接下來我們需要的是一些總體函式,它查看最終結果并說:“計數是否等于零,并且括號開始時是否有效”。從那里,它需要回傳結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/370735.html
