【京东2017年秋招笔试题】统计移除括号对的方案数

  题目:例如:(),()()(),(()()),(((())))都是合法的。东东现在有一个合法的括号序列s,

     一次移除操作分为两步
    1.移除序列s中第一个左括号
   2.移除序列s中任意一个右括号,保证操作之后s还是一个合法的括号序列
  东东现在想知道使用上述的移除操作有多少种方案可以把序列s变为空
  如果两个方案中有一次移除操作移除的是不同的右括号就认为是不同的方案
  例如:s=()()()(),输出1,因为每次都只能选择被移除的左括号所相邻的右括号
   s=(((()))),输出24,第一次有4种情况,第二次有3种情况……,依次类推4*3*2*1=24

   s=(()()),输出4,第一次有3种情况为1.第一个左括号第一个右括号,变为(()),而这种第二次移除的时候有2种,故方案数为2  

                                                             2.第一个左括号和第二个右括号,变为()(),方案数为1

                                                             3.第一个左括号和最后一个右括号,变为()(),方案数为1。共计4种


  输入格式:输入一个合法的括号序列s,序列长度length(大于等于2小于等于20)
  输出格式:输出一个整数,表示方案数

  输入:(((())))   输出:24


解题思路:
 * 遍历字符串,每次把左括号都压入栈,每次遇到右括号,先统计栈中有几个左括号,统计数与上次统计数相乘
 * 接着弹出栈中的一个左括号
 * 直到遍历结束,结果即为方案数

import java.util.Scanner;
import java.util.Stack;

public class Solution {
	public static int find(String s) {
	    //栈
		Stack<Character> ss=new Stack<Character>();
		char c;
		int cout=1;
		for (int i = 0; i < s.length(); i++) {
			c=s.charAt(i);
			if (c=='(') {
				ss.push(c);
			}
			if (c==')') {
				int val = 0;
				for(char x : ss){
					val++;
				}
				cout *= val;
				ss.pop();
			}
		}
		return cout;
	}
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			String s = scanner.nextLine();
			int cout = find(s);
			System.out.println(cout);
	}
  }
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值