题22、括号生成

一、题目1

在这里插入图片描述

二、思路

首先,算法,在得到结果后剔除不正确的,得到最终解。终归不是最优的,最好的还是在得到结果的时候就直接避免出现不正确的。

然后说下面的三种不同的算法的思路。

其中法1和法2,思路是类似的,只是迭代的时候,每一次循环的单位不一样,法1的单位是半个括号,法3的单位是整个括号,但是就这么点不一样就造成整个结果的不同。F3迭代加循环,注定运行超时。

F2就是得到一大串字符串,判断哪个合格。

三、代码

import java.util.ArrayList;
import java.util.List;

public class T0022 {

    public static void main(String[] args) {
        System.out.println( generateParenthesis(3) );
    }
	//法1
    //来自大佬的最优解
    private static List<String> result = new ArrayList<String>();
    public static void generate(String item,int left,int right ) {
        //左括号和右括号满足上述条件的前提下都为n个,添加这个答案
        if(left == 0 && right == 0) {
            result.add(item);
            return;
        }
        //左括号的个数小于n 才能继续放左括号
        if(left > 0) {
            generate(item+"(",left-1,right);
        }
        //左括号个数必须大于右括号的放置个数 才能继续放右括号
        if(left < right) {
            generate(item+")",left,right-1);
        }
    }
    public static List<String> generateParenthesis(int n) {
        /**
         *左括号个数必须大于右括号的放置个数 才能继续放右括号
         *左括号的个数小于n 才能继续放左括号
         *左括号和右括号满足上述条件的前提下都为n个,添加这个答案
         */
        List<String> res = new ArrayList<>();
        generate("",n,n);
        return result;
    }

/*
	//法2
    //非最优解,但是勉强通过
    public static List<String> generateParenthesis(int n) {

        List<String> result = new ArrayList<>();

        //在通过循环得到不重复的长度为2n的二进制10串,和括号串对应,之后判断是否是合格的括号串
        for (int i = (int)Math.pow(2,2*n-1); i < Math.pow(2,2*n); i+=2 ){
            //将十进制的i转化为二进制的串,之后通过replaceAll方法转化为括号串
            String tmp = Integer.toString(i, 2).replaceAll("1", "(").replaceAll("0", ")");

            //通过判断将合法的存储在结果集中
            if ( isValid(tmp) )
                result.add( tmp );
        }

        return result;
    }

    //根据之前的一道题更改的判断算法,判断输入的括号串是否是符合规定的
    public static boolean isValid(String s) {

        int stoke = 0;
        for ( char i : s.toCharArray() ){
            if ( i == '(' ){
                stoke++;
            }else {
                if (stoke == 0 )
                    return false;

                if ( i == ')'  ){
                    stoke--;
                }else
                    return false;
            }
        }
        return stoke==0;
    }
*/

/*
 	//法3
    //此法超时
    private static List<String> result = new ArrayList<String>();
    public static List<String> generateParenthesis(int n) {

        //以“()”为一个单位,进行循环,最后对每一个得到的结果进行判断是否重复
        donext( "()", n-1 );
        return result;
    }

    public static void donext(String str, int len){        
        //在迭代结束后
        if ( len == 0 ){
            //如果在结果集中不重复就将其添加在结果集中
            if ( !result.contains(str) )
                result.add(str);
        //还可以继续进行循环   
        }else{
            
            //进行循环,将“()”插入不同的位置,之后进行下一次的迭代
            for( int i = 0; i < str.length(); i++ ){
                String tmp = str.substring(0, i )+"()"+str.substring(i);
                donext( tmp, len-1 );
            }
        }
    }
*/
}

  1. 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/generate-parentheses
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎

发布了48 篇原创文章 · 获赞 1 · 访问量 844

猜你喜欢

转载自blog.csdn.net/weixin_45980031/article/details/104278447
今日推荐