回溯算法
采用回溯算法进行求解。其基本思想为:沿一条路往前走,走到头后,判断是否符合要求,然后返回上一个岔路口,换条路继续走,走到头继续判断是否符合要求,并返回上一个岔路口,如何该岔路口其他岔路也走过了,则再往上返回上个岔路口,如此往复,直到返回出发点。
例如本题,每个岔路就是在 字符串 S 中继续放 “(”还是放 “)”,结束条件是字符串长度是否等于 2 * n。假如 n = 3,则求解时,先生成解1:"((()))",满足结束条件,存入 res 中,然后回溯上一个岔路A:"((",此时换条路就变成,"(()",然后继续走下一个岔路B。走完后,在返回岔路A,岔路A下面的所有岔路均走过,继续返回岔路C:"(",换条路:"()",重复上述过程,直至返回到起点 " "。输出解空间。
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res = []
# 设置空字符串 S 作为临时变量存储不完整解
def BackTrack(S = "", left = 0, right = 0):
if len(S) == 2 * n:
res.append(S) # 当空字符串 S 长度满足要求时结束,存入 res 中
return
if left < n: # left与right 用于判断结束条件与选择条件
BackTrack(S + "(", left + 1, right)
if right < left:
BackTrack(S + ")", left, right + 1)
BackTrack()
return res