后浪 · 正青春

LeetCode上一道递归算法问题

2021-01-16  本文已影响0人  乔一丁_2020强化班
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,说明需要排的左括号大于右括号的数量。但是如果需要排布的左括号多的情况是不存在的。

为什么说是不存在的呢,因为括号都是左括号开头,右括号结尾,所以一定是先排过左括号了,才会排右括号,所以剩余的右括号总是大于等于左括号的数量。(重点理解:试想一下,如果剩余的左括号比右括号多,因为左括号总数和右括号总数是相同的,所以,前面部分的右括号要比前面部分的左括号多,就会导致前面部分右括号肯定有未配对的)

上一篇 下一篇

猜你喜欢

热点阅读