前言:
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