數字 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個左括號所對...