Problem Statement
Correct parentheses sequences can be defined recursively as follows:
- The empty string "" is a correct sequence.
- If "X" and "Y" are correct sequences, then "XY" (the concatenation of X and Y) is a correct sequence.
- If "X" is a correct sequence, then "(X)" is a correct sequence.
- Each correct parentheses sequence can be derived using the above rules.
Examples of correct parentheses sequences include "", "()", "()()()", "(()())", and "(((())))".
You are given two
You would like to interleave the two sequences so that they will form a correct parentheses sequence. Note that sometimes two different ways of interleaving the two sequences will produce the same final sequence of characters. Even if that happens, we count each of the ways separately. (See Example 0 for a clarification.)
Compute and return the number of different ways to produce a correct parentheses sequence, modulo 10^9 + 7.
Definition
- Class:
- InterleavingParenthesisDiv2
- Method:
- countWays
- Parameters:
- String, String
- Returns:
- int
- Method signature:
- int countWays(String s1, String s2)
- (be sure your method is public)
Constraints
- s1, s2 will each have between 1 and 50 characters, inclusive.
- Each character of s1, s2 will be either '(' or ')'.
Examples
"(()"
"())"
Returns: 19
The 19 ways are: Here, the red characters come from the first sequence, and the blue characters come from the second sequence.
")"
"("
Returns: 1
"((((("
")))))"
Returns: 42
"()(()"
"))((())"
Returns: 10
"()()()()()()()()()()()()()()()"
"()()()()()()()()"
Returns: 493841617
Don't forget about the mod.
"())())))"
"))(((("
Returns: 0
"))()(((())))))()))"
"((()(()(())(((()"
Returns: 488433476
"((((((((((((((((())("
"((()))(()))))(((()())()))(()))((()))))))))))))))"
Returns: 829753739
"()()(((((((()))"
")(((((((((())))))))))))))"
Returns: 115196654
"()("
"(())(()(()()))())"
Returns: 969
"((((()()"
")())((()))))"
Returns: 43887
"))))))()(((((((((()((()))))(()(()()(((()"
"()()))()((())())))))(()()()))(())))))())))(((((((("
Returns: 0
"))))(())(()(((())))))()((())()()())((((((()))()("
"()))))))(()()())))))(())(()(()((((()))((()(())(((("
Returns: 0
"()((((((((((((())((((())))"
"()))()(()))))()()(()))))))))"
Returns: 944954230
")((((((((()(((()(()))))))))))))))))"
"()((((())(((((((())))))"
Returns: 379054699
"()((()()))(()((()()(((((((())(())(((()))))))))))))"
"((()()()())))))((((())(()(((()((()(())))))))"
Returns: 479014504
"(((((((("
"((((((((()()))((((((((((()))))))))))))))))))))))))"
Returns: 616123216
"()((((((((()(((()(((((((()((((((())))))))))"
"(()(()(())()(())(())()))()()())(())))))))))))))))"
Returns: 8749767
"((((())(()()(()))()((()"
"(((((())((()((((((())((()((()))))))))))))))))))))"
Returns: 458288826
"(((((((()()(((((()()((((((((((()))))))))))))))))))"
"()((()(((()((((()(()((((()))()()))))))))))))))))"
Returns: 501921695
"(((())()))))))()))((()())(((((())"
"(((()((((()()((()()(()((())()(()()())))))))))))"
Returns: 817005311
")(()))(((((((((()(((((((()()((((("
"))())()))()()((())))()())())())()))))))))))"
Returns: 0
"(((((((((((((((((((((()())))"
"))))()))())))))))))()(()))))"
Returns: 56479236
")))(("
"))))()((()((((((((((())))))))"
Returns: 0
"("
")))()()()()((()))(())((())())()()(()()((())"
Returns: 0
")(((()()())()())(()))))((()()(()))(()))((((((((("
"())))(())())())()))(()))(())()(())()(()(()"
Returns: 0
"((()(((()(()(()(((()()))()))))))))))"
"((()(((((()((()((((()(((()))))))))))))))"
Returns: 918919795
"())((()()(((())())((((((())))()(()))(()((("
"()()())()))())))))()))()))()))))()(()()((((((("
Returns: 0
")))()(())))))))()())))()()))))()()))))"
"(()(((((((()()((())))))(((()(((((()()((()((((("
Returns: 898557502
"(())())())(()()))())()())))((()())))))))))"
")(((((((((((()(()((((((((()())()))))"
Returns: 115256033
"()((((()(((((((((((((((((((((())))"
"()(()(()))())()))(()(())()()))))))))))))))))))))"
Returns: 914068968
"(((((()()((()(((((((()(())))))))))))))"
"((()(()((((((((()((((()())))))))))))))))))"
Returns: 252107905
"(()())))(()((()()())((()()))(((()()()((()(())))"
")()))))((()"
Returns: 0
"(()()(((((((())))))(())()))(((()))))))))))))"
"()))((((((()(((((()(()())((())()))"
Returns: 990373168
"(()()))())())()(())()((((((()))))))))))))))))"
"(((((((()()(((()()(()((((()()))"
Returns: 244147384
"))(((()(()((())((((((((()(()(()))((((()())))))))"
")(((()(()))))()()))))))(()()))"
Returns: 0
")((((())(((((((((((()((()))()))))))))))))))))"
"(((((((((()((((((()(())(((())))))))))))))))"
Returns: 517153446
")())(((((((()(()((()((()()((()()())))))))))))"
"()((()(((((()()(())(((()()()(((()()))))))))))))))"
Returns: 774373786
"(()(((()(((()(()()()((((()()()))))))))))))))))"
"((((((()(()((((())(((()()()(()))))))))))"
Returns: 762151133
")((())((((((((()((((((())(((((()))))))))))))))"
"()())((((((()))(()()))()(((()())))))))))"
Returns: 121753436
"(())))))(()))))()()()())(((((("
"(())(()(((())()())"
Returns: 0
"(())((((((((((((())()(((())))))))))))))))))))))))"
"((((()(()()(()((((((()((())))))"
Returns: 781593559
")()())()((((((((((((()("
"(())())))((((()((())()(((()))))))))))))))))"
Returns: 950522342
"((((()()(((()((((((()(((()(())()((())))))))))))"
"))()))))(()())())()"
Returns: 963382565
"((()(((()()(((())()))())((()))()())())"
"()((())()()())())()((()())(())))))(()()("
Returns: 607946813
"()))))()))()())(((()())((()()))()(())())))))))"
"((((()(((((((())()(((()(((((()((())))((())))))))"
Returns: 756504935
"(((((((()(((())))()(()((())(())))))()())()))))"
"((((((()(())()()))))))"
Returns: 137543397
"))((((((()((()())((((((((()()(((()(()(()(()"
"(()))))(((((()))))())))())()((()))))())))))))))))"
Returns: 314887681
")))(()(((((((())((((()(()()()((()()("
"))()))(()((()())()(((()))))))(((((()))))))))))))"
Returns: 0
"(((((((()(())((()(()(((((((()())((((()))))))))"
"(())()(()()))())()(()(()))(())(()())))))))))))"
Returns: 136110323
"()))((()(((()()(()()())())((()((()(((((("
"))())())(((()()))()))(())))()(((()()()())())))))))"
Returns: 0
"((((()(()(()((((((((((((()))))))))"
"()((((((()(()((((())((((()))))))))))))))))))))))))"
Returns: 404253529
"(((((((()(((()))))))))))))"
"(((((()((((((())))))))))"
Returns: 659185414
"(((()(((((()()(()(((((((()))))))"
"((((((()((((()()(())((()))))))))))))))))))))))"
Returns: 143223394
"(((()((()(()()((((((((((()(()((())))))))))))))"
")))))())(((())((())()()(()()(((())))))))"
Returns: 291764122
"(((()(((())(((((((((((((((()))))))))))))))))))"
"())((((((((((((((((((((((())))))))))))))))))))))))"
Returns: 14554223
")((()))((()))())))()((()))))((((((((((((("
"()((("
Returns: 0
"(()))()))()))())(((()))))))()()))))(((("
"(()(())))))())()(((((()()))()(((((((((((((((((((("
Returns: 0
")()()((())((()((()(((("
"()((())()("
Returns: 0
")()(((((()(()(((()()(((((((()()())))))))"
"(()("
Returns: 0
"(((()(((()((()(()())((()()((((()(()()()(())(((((("
"))()())))))))(((()(())))))())(()())()()"
Returns: 0
"(((()())()())(()"
"()()((()()))((())()()()))(())()()((((((((("
Returns: 0
")(()()())(()(((((()(((((((("
"))()())(()(()()))"
Returns: 0
"((()()((((()(((((())))"
"((((()(()()))((())))"
Returns: 0
"())))("
"()((((((()(((((((())"
Returns: 0
"((()((()(((("
"))((())((("
Returns: 0
"("
"("
Returns: 0
"((((("
")"
Returns: 0
"())))))))))))"
"(((((((((((((((((())())"
Returns: 0
"()()()()()()()()()()()()()()()()()()()()"
"()()()()()()()()()()()()()()()()()()()()"
Returns: 720596125
"(((((((((((((((((((((((((((((((((((((((((((((((((("
"(((((((((((((((((((((((((((((((((((((((((((((((((("
Returns: 0