再戰DFS,leetcode括號生成

2021-10-04 21:42:43 字數 1531 閱讀 4824

數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。

示例:

輸入:n = 3

輸出:[

"(((

)))",

"(()(

))",

"(())()",

"()(())",

"()()()"

]

思路推薦題解區的這篇回溯演算法(深度優先遍歷)+ 廣度優先遍歷 + 動態規劃

然而這次我只是學習了回溯演算法,也就是dfs,若是江湖再見,我一定要搞定bfs了。

dfs的減法實現

var res [

]string

func

generateparenthesis

(n int)[

]string

dfs(n,n,"")

return res

}func

dfs(left,right int

,cur string

)if left>

0if right>left

}

dfs的加法實現

var res [

]string

func

generateparenthesis

(n int)[

]string

if n==

0dfs(""

,0,0

,n)return res

}func

dfs(cur string

,left,right,n int

)if leftif leftif right}

定義狀態

dp[i]表示使用i對括號能夠生成的組合。

所以需要是列表形式儲存。

狀態轉移

考慮i對括號的組合是在i-1對括號的基礎上得到的

那麼第i個括號可以裡面有組合,也可以後面有組合

所以狀態轉移方程是:

dp[i]

="(" + dp[可能的括號對數] + ")" + dp[剩下的括號對數]

初始狀態和輸出

func

generateparenthesis

(n int)[

]string

} dp :=

string

dp0 :=

string

dp =

(dp, dp0)

for i :=

1; i <=n; i++

for j :=

0; j < i; j++}}

dp =

(dp, cur)

}return dp[n]

}

BZOJ4350 括號序列再戰豬豬俠

括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...

bzoj4350 括號序列再戰豬豬俠

括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...

bzoj4350 括號序列再戰豬豬俠 區間DP

括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...