手撸代码系列(三)

第三期:实现一个算法打印出n对括号的有效组合(递归法)

此博客根据哔哩哔哩中蓝桥杯相关视频,仅用于自己学习,如有侵犯版权,立马删除。

题目分析:以n=3为例

第一步: 我们需要借助Set集合装所有符合要求的括号。
第二步:当n=1时,在空集合Set中先添加一个括号,为 [()],记为 S 1 {S_1}
第三步:当n=2时,对集合 S 1 {S_1} 中的元素,分别在其左边右边,和外面添加一个括号(在其内部添加貌似也是这个道理,但是困难重重),为 [()(), ()()()],记为 S 2 {S_2} 。(标粗的认为是n=2时新添加的括号,Set集合会去重)
第四步:当n=3时,对集合 S 2 {S_2} 中的元素,分别在其左边右边,和外面添加一个括号,为 [()()(), ()()(), ()(), ()(), ()(), ()],记为 S 3 {S_3} 。(高亮的认为是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}} +左+右+外
挑战:递归的效率不高,有待改进。

发布了8 篇原创文章 · 获赞 0 · 访问量 50

猜你喜欢

转载自blog.csdn.net/qq_36565596/article/details/104817274