022.括号生成,回溯算法轻松搞定,树结构图,清晰易懂
鲁迅说过,每天刷一道二哥的 LeetCode 题解,感觉精神百倍,工作效率都提高了(dog)。
题意
数字 n 代表生成括号的对数,请你设计一个方法,用于能够生成所有可能的并且 有效的 括号组合。
1 <= n <= 8
难度
中等
示例
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
输入:n = 1
输出:["()"]
分析
什么是有效的括号?例如:
String: "( ( ( ) ) )"
位置 :1 2 3 4 5 6
左括号数量:1 2 3 3 3 3
右括号数量:0 0 0 1 2 3
再例如:
String: "( ( ) ( ) )"
位置 :1 2 3 4 5 6
左括号数量:1 2 2 3 3 3
右括号数量:0 0 1 1 2 3
我们发现,无论在哪个位置,右括号数量都是小于等于左括号的,并且当左括号数量小于 n 时,我们可以无限添加左括号,对吧?
当右括号数量小于左括号数量时,我们可以无限添加右括号。
当括号的数量达到 2n 时,我们就得到了所有的有效括号。
当我们把括号的问题转化成树结构的时候,就可以更直观地理解这个问题。在数结构中,每个节点代表一个括号组合。
从根节点(空字符串)开始,每一层代表字符串中添加新括号的操作。对于每个节点,它最多可以有两个子节点:
- 一个代表添加一个左括号
(,如果添加后不超过 n 个左括号 - 另外一个代表添加一个右括号
),如果添加后右括号数量小...
回复