Description
牛客网 2018校招真题 括号匹配方案
Solving Ideas
遍历字符串,如果遇到'('
,将其压入栈中;如果遇到')'
,则栈中第一个左括号对应的可选的右括号数为栈的大小;继续这样的操作,连乘所有左括号可选的方案数即为最终结果。
这样做为什么是对的,可以这样理解:
假设有合法括号序列"(((()())))()"
,因为每次只能移除序列中第一个左括号,相应也要移除一个右括号且需要保证移除可选的右括号后序列仍是合法的,所以关键就要确定对应地能够移除的右括号有几个,也即第一个左括号可选的右括号的方案数。
那么第一个左括号对应的可选的右括号有几个呢?
利用上面的方法,当遇到第一个')'
时,栈中有4个'('
,此时第一个'('
可选的右括号有4个,因为栈中有4个'('
,相应地必有4个')'
与之形成合法序列,在本例中也就是第1、3、4、5个右括号,同理可以确定每一个左括号的方案数。
Time complexity :
O
(
n
)
O(n)
O(n)
Space complexity :
O
(
1
)
O(1)
O(1)
Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author wylu
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] s = br.readLine().toCharArray();
int res = 1, count = 0;
for (char ch : s) {
if (ch == '(') count++;
else res *= count--;
}
System.out.println(res);
}
}