zoukankan      html  css  js  c++  java
  • LeetCode刷题笔记-回溯法-括号生成

    题目描述:

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

    例如,给出 n = 3,生成结果为:

    [
    "((()))",
    "(()())",
    "(())()",
    "()(())",
    "()()()"
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/generate-parentheses

    分析:

    方法2:回溯法

     1、对于每个位置都有两种选择左括号,和有括号。

       2、对于每个位置都依此添加左括号,和有括号,若是不符合条件,立马停止当前分支的的继续前行。

    方法1,是用的是贪心法,

      1、在n=3的是在n=2的基础上,分别在左侧,右侧,外侧添加括号。

     java实现

    class Solution {
        //特此声明:我没错,辣鸡后台。我就没错!!!写此注释,以表抗议!!
        public List<String> generateParenthesis2(int n) {  //这是方法1,,,用的可能是贪心算法。。
            List<String> list = new ArrayList<>();
            if (n<1)
                return list;
    
            list.add("()");
            if (n==1)
                return list;
    
            String str="()";
            String s="";
            for (int i=2;i<=n;i++) {
                int j=0;
                int list_len= list.size();  //先算好,别他娘的放到循环中,哼!!!!!!
    
                int k=j;
                for (j = 0; j < list_len; j++) {  //把list所有元素取出来,每个分别处理一遍,相对于队。
    
                    s = list.get(k);
                    String left = "()" + s;
                    String mid = "(" + s + ")";
                    String right = s + "()";
                    list.add(mid);
                    list.add(left);
                    if (!left.equals(right)) {
                        list.add(right);
                    }
                    list.remove(s);
                }
            }
                return list;
        }
        
        public List<String> generateParenthesis(int n){
            List<String> result=new ArrayList<>();
            gen(result,"",n,n);
            return result;
        }
    
        public void gen(List<String> result,String str,int l,int r){
            if (l==0 && r==0){
                result.add(str);
                return;
            }
            if( l>r || l<0 || r<0)
                return ;
            String str2=new String(str); ////*****这波操作,看清楚喽,每个位置就两种情况,就不写for循环了
            gen(result,str+="(",l-1,r);
            gen(result,str2+=")",l,r-1);
    
        }
    }
  • 相关阅读:
    Toolkit-常用函数库
    webpack 4版本以上 并行编译 thread-loader
    json格式数据下载
    npm 并行执行 concurrently
    WebAssembly assemblyscript
    npm outdated npm prune
    require import 引入区别
    C#数组的微软官方文档(链接)
    在C#中,override的成员仍然是virtual的
    SQL Server的DECIMAL类型,进行算术运算后会有精度变化
  • 原文地址:https://www.cnblogs.com/sqchao/p/11073479.html
Copyright © 2011-2022 走看看