程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Leetcode刷題Python】22. 括號生成

編輯:Python

1 題目

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

示例 1:

輸入:n = 3
輸出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

示例 2:

輸入:n = 1
輸出:[“()”]

2 解析

(1)方法一:暴力求解
為了生成所有序列,我們可以使用遞歸。長度為 nn 的序列就是在長度為 n−1 的序列前加一個 (’ 或 ‘)’。

為了檢查序列是否有效,我們遍歷這個序列,並使用一個變量balance 表示左括號的數量減去右括號的數量。如果在遍歷過程中 balance 的值小於零,或者結束時balance 的值不為零,那麼該序列就是無效的,否則它是有效的。
(2)方法二:回溯方法

如果左括號數量不大於 n,我們可以放一個左括號。如果右括號數量小於左括號的數量,我們可以放一個右括號。

3 Python實現

(1)方法一

class Solution:
def generateParenthesis(self, n: int) -> List[str]:
def generate(A):
if len(A) == 2*n:
if valid(A):
ans.append(''.join(A))
else:
A.append('(')
generate(A)
A.pop()
A.append(')')
generate(A)
A.pop()
def valid(A):
bal = 0
for c in A:
if c == '(':
bal += 1
else:
bal -= 1
if bal < 0:
return False
return bal == 0
ans = []
generate([])
return ans

(2)方法二

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved