public static List<String> res = new ArrayList<>();
private static void dfs(int left,int right,String curStr){
if(left==0&&right==0){
res.add(curStr);
return;
}
if(left>0){
dfs(left-1,right,curStr+"(");
}
if(right>left){
dfs(left,right-1,curStr+")");
}
}
这是力扣上一道有意思的算法问题。
首先,我们先来理解dfs这个方法的含义:left个左括号和right个右括号,能有几种排列方式,将所有可能的且保证配对的括号排列起来。
第一个if的意思是当左右括号都被排完之后,将整个方法生成的字符串添加到列表res中去,也就是一条递归支线的结束。
第二个的if是当还有左括号时,将左括号排布进去,然后递归自身,排布剩余的括号。剩余的右括号数量大于传入左括号数量的部分,是可以随意排列的,因为前面已经排好了与之配对的左括号。
第三行的if是当右括号比左括号多时,排布右括号。因为上面第二个if已经排布过左括号了,这次仅判断是否应该排布右括号,这时如果left等于right,说明前面的括号正好匹配完,要是再排右括号,就会导致它没有匹配的左括号;如果此时left大于right,说明需要排的左括号大于右括号的数量。但是如果需要排布的左括号多的情况是不存在的。
为什么说是不存在的呢,因为括号都是左括号开头,右括号结尾,所以一定是先排过左括号了,才会排右括号,所以剩余的右括号总是大于等于左括号的数量。(重点理解:试想一下,如果剩余的左括号比右括号多,因为左括号总数和右括号总数是相同的,所以,前面部分的右括号要比前面部分的左括号多,就会导致前面部分右括号肯定有未配对的)
网友评论