[數據結構和算法]狀態樹的問題

問題

給定一個正整數 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)

代碼說明

  1. 結束條件是 y == n ,因爲 x >= y , 所以當 y == n的時候,其實已經到了終點
  2. 優先考慮 x, 當 x < n 的時候,先增加左括號
  3. 但 x > y 的時候,增加右括號
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章