京东2018在线笔试题 第一个编程大题


import java.util.*;

/**
 * 京东笔试题:
 2.如果"X"和“Y”是合法的库列那么“XY”也是一合法的括号库列
 3.如果"X"合法的库列那么"(X)"也合法的括号库列
 4. 每个合法的括号序列都可以甶上面的规则生成.
 例如 "","()","()()()"都是合法的。现在有个合法的括号序列s,一次移除操作为两步:
 1. 移除库列s中的第一个左括号
 2. 移除库列s中任意 一个右括号. 保证操作后之后s还是一个合法的括好序列。

 现在想知道使用上述的移除操作有多少种方案可以把序列s 变为空。

 如果两个方案中有一次移除操作的移除的是不同的右括号就认为是不同的方案。

 例如 s="()()()()",输出为1,因为每次都只能选择被移除的左括号所相邻的右括号.
 s="(((())))",输出为24,第一次有4种情况,第二次有3中情况,..一次类推 4*3*2*1 =24

 输入描述:

 输入包括一行,一个合法的括号序列s,序列长度 length (2<=lenth<=20).
 输出,方案个数
 */
public class Main {
	public static void main(String[] args) {
	//	Scanner sc = new Scanner(System.in);
	//	String n = sc.next();
		// 40,41
		String s="()()()";
		System.out.println(cal(s));

	}

	public static int cal(String string){
		int count = 0;
		char[] chars = string.toCharArray();
		if (chars[0]==')')return count;
		List
   
   
    
     list = countRight(chars);
		for (int i : list) {
			//切割括号后,substring 含头不含尾
			String newString=string.substring(1,i)+string.substring(i+1,string.length());
			if(validate(newString.toCharArray())){
				// 只有两对以上括号才有计算价值,要不然就重复计算了
				if(newString.length()>3){
					count+=cal(newString);
				}else {
					count++;
				}
			}
		}
		return count;
	}

	public static List
    
    
     
      countRight(char[] chars) {
		List
     
     
      
       list =new ArrayList
      
      
       
       ();
		for (int i = 0; i < chars.length; i++) {
			if (chars[i] == ')') list.add(i);
		}
		return list;
	}
	public static boolean validate(char[] a){
		Stack
       
       
         stack = new Stack 
        
          (); for(int i=0;i 
          
         
       
      
      
     
     
    
    
   
   
昨天晚上被这道题虐的死去活来的,终于想出了个能解决的算法,
我的思路的核心是用栈来 校验是否是合法的序列,

转化成 char数组来方便操作 字符串,这样就可以任意切割了。

然后 用递归来算出最终结果。

具体代码如下

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值