一、题目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 );
}
}
}
*/
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎