問題
給定一個正整數 n, 求輸出符合期望的所有的 左右括號的組合。要求,左括號不小於右括號。當 n = 3 的時候,輸出值爲:
["((()))", "(()())", "(())()", "()(())", "()()()"]
分析
這是問題可以抽象成狀態樹:
* 節點: 在 x 的時候(0 <= x <=n), 此時的左右括號的個數爲 (x, y)
* 邊: (x,y) 到 (x +1, y) 或者 (x, y+1) 兩個點的運算
* 約束條件: x >= y ; 當 x == y 時, (x , y +1 ) 不合法
* 起點和終點: (0, 0) -> (n, n)
因爲本題需要得到“全部解”,所以使用深度搜索。
代碼
##
#給定一個正數 n , 輸出所有合法的左右括號的組合,比如 n = 3,
# ((())) ()()() (()())
##
def solution(n)
result = []
help(n, 0, 0, "", result)
end
def help(n, x, y, now, items)
if y == n
items << now
return
end
if x < n
help(n, x + 1, y, now + "(", items)
end
if x > y
help(n, x, y + 1, now + ")", items)
end
return items
end
p solution(3)
代碼說明
- 結束條件是 y == n ,因爲 x >= y , 所以當 y == n的時候,其實已經到了終點
- 優先考慮 x, 當 x < n 的時候,先增加左括號
- 但 x > y 的時候,增加右括號