這是一道基於遞迴實現回溯的問題,要求生成所有有效的括號組合(well-formed Parentheses)。
這題給定一個整數n,表示有n對括號。這需要編寫一個函數,生成所有由n個左括號 ' ( ' 和n個右括號 ' ) ' 組成的、格式正確的字符串。
要被認為是格式正確的 (或稱有效的)括號字符串,必須滿足以下兩個條件:
1.左括號的數量必須等於右括號的數量:在最終字符串中,' ( ' 的數量必須是n,而 ' ) ' 的數量也必須是n。
2.任何時候,右括號的數量不能超過左括號的數量:從左向右掃描字符串的過程中,到任何一個位置為止,出現的右括號數量都必須小於或等於左括號的數量。
例如:當n = 3時:"( ( ( ) ) )"是有效的;"( ) ( ) ( )"是有效的;"( ) ) ("是無效的(在第二個位置,右括號數量變為1,而左括號數量是1,這時還可以;但在第三個位置,右括號數量變為2,左括號數量是1,此時右括號數量2 > 左括號數量1,無效)。
這類要求「生成所有組合」的問題,通常都可以用回溯法來解決。回溯法是一種系統地搜索解空間的技術。
這題解題的核心思想是從一個空的字符串開始,遞迴地向其中添加 ' ( '或 ' ) '
。在每一步,都必須確保添加後的字符串仍然有潛力成為一個有效的括號組合。
首先,先定義openCount和closeCount兩個變數,openCount用來儲存目前已使用的左括號 ' ( ' 的數量;closeCount用來儲存目前已使用的右括號 ' ) ' 的數量。
再來,到了遞迴的過程,檢查以下條件來決定是否可以添加下一個括號:
1.只要已使用的左括號數量(openCount)還沒有達到總數n,就可以添加一個左括號。
2.只要已使用的右括號數量(closeCount)小於已使用的左括號數量(openCount),就可以添加一個右括號。這是為了保證「任何時候,右括號數量不能超過左括號數量」的有效性原則。
至於什麼時候可以結束遞迴(找到一個解)?只要已使用的左括號數量(openCount)和右括號數量(closeCount)都等於n時,就形成了一個長度為2n的有效括號組合,將其加入結果集。