解法:1、n代表的是左括號和右括號的個數,最后生成的字符串的長度為2n,首先想到的就是枚舉的方法,假設有2n的數組,每一個格子都有兩種情況,填做括號還是右括號。
2、很明顯上面的方法是不符合常理的,因為做括號和右括號都是有限制,當n為3的時候,不會出現((((((的情況,所以當我們進行遞歸的時候,就需要進行判斷,當左括號用完的時候就要停止,稱為剪枝。
3、動態規劃解法,當看到有和沒有,放和不放的時候,可以考慮動態規劃的解法。這里有個leetcode上面的講解動態規劃解法,
4、我補充一下我的見解和理解(其實是我沒有很快理解他文章的意思),幫助你從不同的思路上理解。
首先,面向小白:什么是動態規劃?在此題中,當知道所有 i=n-1 的情況時,我們可以通過對之前的情況來算出 i=n 的情況。
本題最核心的思想是,考慮 i=n 時相比 n-1 組括號增加的那一組括號的位置。(ps:建議參考本博客動態規劃篇,從簡單的斐波拉契數列,背包問題開始)
【思路】:
如果你看了本博客的動態規劃內容或者有一定寫動態規劃的經驗的話,會明白對于動態規劃問題的我們要找的就是最優子問題,也就是遞推公式。
假設一種情況,我們已經知道了i=n-1時括號的可能生成排列后,對于i=n的情況,我們只需要把這個完整的“()”放到n-1的排列中就可以了。有兩種情況,一個是這對新加的括號,左括號和右括號里面加入一些在n-1的括號排列組合,或者是這對新加的括號,添加到排列組合中。
舉一個栗子,當n=2的時候,排列組合符合條件的是這兩種,"(())","()()",那我們把“()”放在其中會出現哪幾種情況,"((()))","(())()","(())()","()(())","()()()",
由于能力有限,不知道用什么數據結構來進行很好的插入。暫無代碼,希望有看到相同思路的戰友,或者能寫出來的,留言一下讓我好好學習一下,辛苦了。
#第二種方法
class
Solution
(
object
)
:
def
generateParenthesis
(
self
,
n
)
:
"""
:type n: int
:rtype: List[str]
"""
#list輸出的是最后結果,如n等于3,那么list里面就是裝的所有可能性
self
.
list
=
[
]
#left和right里面存的是括號使用了多少
self
.
_gen
(
0
,
0
,
n
,
""
)
return
self
.
list
def
_gen
(
self
,
left
,
right
,
n
,
result
)
:
if
left
==
n
and
right
==
n
:
self
.
list
.
append
(
result
)
if
left
<
n
:
self
.
_gen
(
left
+
1
,
right
,
n
,
result
+
"("
)
if
left
>
right
and
right
<
n
:
self
.
_gen
(
left
,
right
+
1
,
n
,
result
+
")"
)
class
Solution
:
def
generateParenthesis
(
self
,
n
:
int
)
-
>
List
[
str
]
:
if
n
==
0
:
return
[
]
total_l
=
[
]
total_l
.
append
(
[
None
]
)
# 0組括號時記為None
total_l
.
append
(
[
"()"
]
)
# 1組括號只有一種情況
for
i
in
range
(
2
,
n
+
1
)
:
# 開始計算i組括號時的括號組合
l
=
[
]
for
j
in
range
(
i
)
:
# 開始遍歷 p q ,其中p+q=n-1 , j 作為索引
now_list1
=
total_l
[
j
]
# p = j 時的括號組合情況
now_list2
=
total_l
[
i
-
1
-
j
]
# q = (i-1) - j 時的括號組合情況
for
k1
in
now_list1
:
for
k2
in
now_list2
:
if
k1
==
None
:
k1
=
""
if
k2
==
None
:
k2
=
""
el
=
"("
+
k1
+
")"
+
k2
l
.
append
(
el
)
# 把所有可能的情況添加到 l 中
total_l
.
append
(
l
)
# l這個list就是i組括號的所有情況,添加到total_l中,繼續求解i=i+1的情況
return
total_l
[
n
]
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
