您的位置:首页 > 其它

LeetCode每日一题——T22. 括号生成(中):回溯算法——通用解法

2019-07-21 21:11 246 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_41514090/article/details/96762507

回溯算法

采用回溯算法进行求解。其基本思想为:沿一条路往前走,走到头后,判断是否符合要求,然后返回上一个岔路口,换条路继续走,走到头继续判断是否符合要求,并返回上一个岔路口,如何该岔路口其他岔路也走过了,则再往上返回上个岔路口,如此往复,直到返回出发点。

例如本题,每个岔路就是在 字符串 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: