第三期:实现一个算法打印出n对括号的有效组合(递归法)
此博客根据哔哩哔哩中蓝桥杯相关视频,仅用于自己学习,如有侵犯版权,立马删除。
题目分析:以n=3为例
第一步: 我们需要借助Set集合装所有符合要求的括号。
第二步:当n=1时,在空集合Set中先添加一个括号,为 [()],记为
S
1
{S_1}
S1。
第三步:当n=2时,对集合
S
1
{S_1}
S1中的元素,分别在其左边,右边,和外面添加一个括号(在其内部添加貌似也是这个道理,但是困难重重),为 [()(), ()(),(())],记为
S
2
{S_2}
S2。(标粗的认为是n=2时新添加的括号,Set集合会去重)
第四步:当n=3时,对集合
S
2
{S_2}
S2中的元素,分别在其左边,右边,和外面添加一个括号,为 [()()(), ()()(), ( ()()), ()(()), (())(), ((()))],记为
S
3
{S_3}
S3。(高亮的认为是n=3时新添加的括号,Set集合会去重)
Java代码:
import java.util.HashSet;
import java.util.Set;
public class Prenthesis {
/**
* 递归+set集合
* @param k 待求的括号个数
* @return
*/
private static Set<String> prenthesis(int k){
Set<String> s_n = new HashSet<>();
if (k==1){
s_n.add("()");
return s_n;
}
Set<String> s_n_1 = prenthesis(k-1);
for (String x: s_n_1) {
s_n.add("()"+x);
s_n.add("("+x+")");
s_n.add(x+"()");
}
return s_n;
}
public static void main(String[] args) {
Set<String> result = new HashSet<>();
result = prenthesis(3);
for (String str: result) {
System.out.println(str);
}
System.out.println(result);
System.out.println(result.size());
}
}
简要分析:
总结:该算法的思路为
S
n
=
S
n
−
1
{S_{\rm{n}}} = {S_{n - 1}}
Sn=Sn−1+左+右+外。
挑战:递归的效率不高,有待改进。