022-Generate Parentheses

Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]

利用遞歸,注意滿足的兩個條件:左括號一定要大于零,右括號一定要大于零益缠,且大于左括號的數(shù)量

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """

        res=[]  
        tmp=['' for i in range(n+n)]  
        self.generate(res,n,n,tmp,0)  
        return res  
    def generate(self,res,l,r,tmp,index):  
        if l==0 and r==0:  
            res.append(''.join(tmp))  
            return  
        if l>0:  
            tmp[index]='('  
            self.generate(res,l-1,r,tmp,index+1)  
        if r>0 and r>l:  
            tmp[index]=')'  
            self.generate(res,l,r-1,tmp,index+1)  

再來看一個backtrack的方案:

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n == 0: return ['']
        ans = []
        def backtrack(S = '',left = 0, right = 0):
            if len(S) == 2 * n:
                ans.append(S)
                return
            if left < n:
                backtrack(S+'(',left + 1, right)
            if right < left:
                backtrack(S+')',left,right + 1)

        backtrack()
        return ans

和一個dp的方案:

To generate all n-pair parentheses, we can do the following:

Generate one pair: ()

Generate 0 pair inside, n - 1 afterward: () (...)...

Generate 1 pair inside, n - 2 afterward: (()) (...)...

...

Generate n - 1 pair inside, 0 afterward: ((...))

I bet you see the overlapping subproblems here. Here is the code:

(you could see in the code that x represents one j-pair solution and y represents one (i - j - 1) pair solution, and we are taking into account all possible of combinations of them)

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        dp = [[] for i in range(n + 1)]
        dp[0].append('')
        for i in range(n + 1):
            for j in range(i):
                dp[i] += ['(' + x + ')' + y for x in dp[j] for y in dp[i - j - 1]]
        return dp[n]

看看caikehe的方案:

毫無疑問例驹,這個非常好理解拾积!

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res = []
        self.dfs(n, n, "", res)
        return res

    def dfs(self, leftRemain, rightRemain, path, res):
        if leftRemain > rightRemain or leftRemain < 0 or rightRemain < 0:
            return  # backtracking
        if leftRemain == 0 and rightRemain == 0:
            res.append(path)
            return
        self.dfs(leftRemain-1, rightRemain, path+"(", res)
        self.dfs(leftRemain, rightRemain-1, path+")", res)

看看stefan大大的方案:

# Solution 1
#
# I used a few "tricks"... how many can you find? :-)

def generateParenthesis(self, n):
    def generate(p, left, right, parens=[]):
        if left:         generate(p + '(', left-1, right)
        if right > left: generate(p + ')', left, right-1)
        if not right:    parens += p,
        return parens
    return generate('', n, n)
# Solution 2
#
# Here I wrote an actual Python generator. I allow myself to put the yield q at the end of the line because it's not that bad and because in "real life" I use Python 3 where I just say yield from generate(...).

def generateParenthesis(self, n):
    def generate(p, left, right):
        if right >= left >= 0:
            if not right:
                yield p
            for q in generate(p + '(', left-1, right): yield q
            for q in generate(p + ')', left, right-1): yield q
    return list(generate('', n, n))
# Solution 3
#
# Improved version of this. Parameter open tells the number of "already opened" parentheses, and I continue the recursion as long as I still have to open parentheses (n > 0) and I haven't made a mistake yet (open >= 0).

def generateParenthesis(self, n, open=0):
    if n > 0 <= open:
        return ['(' + p for p in self.generateParenthesis(n-1, open+1)] + \
               [')' + p for p in self.generateParenthesis(n, open-1)]
    return [')' * open] * (not n)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末储矩,一起剝皮案震驚了整個濱河市笨农,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扰路,老刑警劉巖尤溜,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汗唱,居然都是意外死亡宫莱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門哩罪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來授霸,“玉大人,你說我怎么就攤上這事际插〉舛” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵框弛,是天一觀的道長辛辨。 經(jīng)常有香客問我,道長瑟枫,這世上最難降的妖魔是什么斗搞? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮力奋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幽七。我一直安慰自己景殷,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布澡屡。 她就那樣靜靜地躺著猿挚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驶鹉。 梳的紋絲不亂的頭發(fā)上绩蜻,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音室埋,去河邊找鬼办绝。 笑死,一個胖子當著我的面吹牛姚淆,可吹牛的內(nèi)容都是我干的孕蝉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼腌逢,長吁一口氣:“原來是場噩夢啊……” “哼降淮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搏讶,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤佳鳖,失蹤者是張志新(化名)和其女友劉穎霍殴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系吩,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡来庭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淑玫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巾腕。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖絮蒿,靈堂內(nèi)的尸體忽然破棺而出尊搬,到底是詐尸還是另有隱情,我是刑警寧澤土涝,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布佛寿,位于F島的核電站,受9級特大地震影響但壮,放射性物質(zhì)發(fā)生泄漏冀泻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一蜡饵、第九天 我趴在偏房一處隱蔽的房頂上張望弹渔。 院中可真熱鬧,春花似錦溯祸、人聲如沸肢专。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽博杖。三九已至,卻和暖如春筷登,著一層夾襖步出監(jiān)牢的瞬間剃根,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工前方, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狈醉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓惠险,卻偏偏與公主長得像舔糖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子莺匠,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容