1. 程式人生 > >括號序列匹配問題

括號序列匹配問題

題目描述:
合法的括號匹配序列被定義為:
1. 空串""是合法的括號序列
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。

思路:

這個題字串長度不長,可以直接爆搜。

有一種程式碼比較簡單的解法,挨著累計'('的個數,遇到')'就完成一次匹配,把情況數乘進答案。本質是把題目所說的移除操作做了一個等價的變化。

java程式碼如下:

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

public class Main07 {
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		String string=in.next();
		chkParenthesis(string);
	}

	private static void  chkParenthesis(String string) {
	


			if(string.length()%2==1) 
				return ;
			char c[] =string.toCharArray();
			int left =0;
			
			int sum=1;
			for(int i=0;i<c.length;i++){
			if(c[i]=='(') {
				left++;
			    
			}else {
				sum*=left;	
				left--;
			}
			
			/*if(left<0) 
				return false;
			}*/
			}
	
		System.out.println(sum);
		return ;
}
}
輸入
(((())))
輸出:24