输出n对圆扩号的所有有效组合

前言:

n年前,面试某大厂时,面试官要求手写该算法,当时记得只说出了想用递归去做,但具体实现上由于紧张等原因吧,思路不够清晰,没有描述清楚,当时的面试也是挂掉了,后来也想过,但是没整理出来,直到最近看到leetcode上有道题(https://leetcode.com/problems/generate-parentheses/)与我当时面试的题及其类似,花了一上午的时间整理出来该题,仅供参考(很多思路是参考CSDN上众大神的,感恩)

正文:

该问题可以使用递归去做(还有其他方式,此处不做讨论),分析该问题,可以定义三个规则

1:当左括号的数量小于n时,可以继续打印左括号。

2:当右括号的数量小于左括号且小于n时,可以继续打印右括号。

3:当字符串的长度等于n*2时是需要打印的字符串。

代码如下

 public static List<String> generateParenthesis(int n) {
        return generateEffectStr(0, 0, "", n);
    }

    public static void main (String[] args){
        List<String> strings = generateParenthesis(3);
        strings.stream().forEach(x->System.out.println(x));
    }
    public static List<String> list = new ArrayList<>();

    public static List<String> generateEffectStr(int left, int right, String str, int num) {
        if (str.length() == num * 2) {
            list.add(str);
            return list;
        }
        if (left < num) {
            generateEffectStr(left + 1, right, str + '(', num);
        }
        if (right < num && left > right) {
            generateEffectStr(left, right + 1, str + ')', num);
        }
        return list;
    }

递归流程如下:”

另外:关于递归的知识可以参考(很好的一篇文章):https://blog.csdn.net/theknotyouknow/article/details/24435291

猜你喜欢

转载自blog.csdn.net/houkun_dobest/article/details/85328678