输出一个正整数:n,让括号进行正确匹配,
列出它的所有正确的排列方式:
package PairsOfParentheses;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import org.junit.Test;
public class testPairOfParentheses {
@Test
public void fun(){
//记录开始时间
long startTime = System.currentTimeMillis();
//输入一个数字
Scanner input=new Scanner(System.in);
System.out.print("输入一个数字:");
int inputFigure=input.nextInt();
//调用方法,排列所有的组合情况
List<String> PairOfParenthesesList=generateParenthesis(inputFigure);
//打印出链表中所有的组合方式
for(String list:PairOfParenthesesList)
System.out.println(list);
System.out.println(PairOfParenthesesList.size());
//记录结束时间
long endTime = System.currentTimeMillis();
//得出最后时间
System.out.println((endTime-startTime)/1000+"s");
}
public List<String> generateParenthesis(int inputFigure){
//定义一个链表,存储所有可能的情况
List<String> resultList=new ArrayList<String>();
if(inputFigure>0){ //定义一个两倍的数组
char[] parentheses=new char[2*inputFigure];
//定义一个递归函数
solve(inputFigure,inputFigure,parentheses,resultList);
}
return resultList;
}
/**
* @param left 剩余可用的左括号数
* @param right 剩余可用的右括号数
* @param parentheses 到上一次为止括号使用的情况
* @param result 存放结果的集合
*/
//递归调用,找出所有的组合情况
private void solve(int left, int right, char[] parentheses, List<String> result){
if(left<0 || right<0 ||left>right ){
//出现这三种情况什么都不做
}
else if(left==0 && right==0){
//如果当left为0且right为0,将字符串存入到list链表,这是是个出口
//要遍历出来所有存在的情况
result.add(new String(parentheses));
}
else{ //从后面到前面进行递归,直到找出符合条件的组合
//设置字符串下标
int index=parentheses.length-left-right;
parentheses[index]='(';
//向左递归,找出所有的可能
solve(left - 1, right, parentheses, result);
parentheses[index]=')';
//递归找出所有的可能
solve(left, right-1, parentheses, result);
}
}
}
时间复杂度:O(n)
空间复杂度:O(n)
源码github地址:https://github.com/zhangyu345293721/leetcode