对于给定k为括号的总对数,需要将能够组合的所有有效括号组合方式求出的问题。
对于回溯算法是将解空间看做一定的结构,通常是作为树形结构或者图形结构,回溯算法实际上是一种类似枚举的探索尝试过程,主要是在探索尝试过程中寻找解决问题的解,当发现已不满足给定条件的时候,就进行回溯退回,并尝试其他的路径。
对于括号问题有如下例子:
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
括号组合问题需要考虑到组合之后括号的有效性,需要注意"("与")"配对上才能成为一对有效的括号,无论如何组合,第一个符合一定是"(",这是可以固定的一个位置,在确定当前位置是否可以添加")"的时候,需要考虑在此为止之前一共有多少个其他的"("和")",当左括号的数量小于或等于有括号的数量的时候,时不可能在当前位置添加")"的,在确定当前位置是否可以添加"("的时候,只要确定当前位置之前出现的"("数量小于给定的k就可以了。
针对这几点,可见在确定目前位置之前,需要知道到目前为止已经出现的各种括号的个数,用left_num和right_num分别表示目前左括号的个数和右括号的个数。由于最终返回的结果是列表,列表中需要包含各种组合方式,因此括号组合过程中需要通过一个字符串去累计目前组合方式。当所有给定符号都被放置完毕之后,就将字符串加入结果列表中即可。递归终止条件就是当left_num和right_num之和等于给定符号的个数的时候,即回溯。否则继续深入向下探索,分为两种情况来判断,一种是当前位置是否可以放置“(”,只要目前为止左括号的个数小于给定的k,即可放置,第二种是判断当前位置是否可以放置")",只要目前位置的right_num小于left_num即可。
示例二的最终结果如下:
class Solution:def func(self, k):re=[]def dfs(left_num,right_num,string):if left_num+right_num==2*k:re.append(string)return if left_num<k:dfs(left_num+1,right_num,string+'(')if right_num<left_num:dfs(left_num,right_num+1,string+')')dfs(1,0,'(')return re