讓S= any valid sequence of parentheses from n(and n)
。 現在任何有效的序列S可以寫成S=X+Y
其中
X=valid prefix
也就是說,如果遍歷X從左至右,在任何時間點,numberof'(' >= numberof')'
Y=valid suffix
即如果從右到穿越Ÿ離開,在任何時間點,numberof'(' <= numberof')'
對於任何S
許多對X
和Y
是可能的。
在我們的例子:()(())
`()(())` =`empty_string +()(())`
= `(+)(())`
= `() + (())`
= `()(+())`
= `()((+))`
= `()(() +)`
= `()(()) + empty_string`
注意,當X=empty_string
,然後從n個(
數量的有效S
和n )
=有效後綴Y
的從n個(
和數n )
現在,算法如下: 我們將從X= empty_string
開始並遞歸增長X
直到X=S
。在任何時候,我們有兩個選擇成長X
,要麼追加 '(' 或追加 ')'
讓dp[a][b]= number of valid suffixes using a '(' and b ')' given X
nop=num_open_parenthesis_left
ncp=num_closed_parenthesis_left
`calculate(nop,ncp)
{
if dp[nop][ncp] is not known
{
i1=calculate(nop-1,ncp); // Case 1: X= X + "("
i2=((nop<ncp)?calculate(nop,ncp-1):0);
/*Case 2: X=X+ ")" if nop>=ncp, then after exhausting 1 ')' nop>ncp, therefore there can be no valid suffix*/
dp[nop][ncp]=i1+i2;
}
return dp[nop][ncp];
}`
讓我們例如,n = 3即3 (
和3 )
現在開始X=empty_string
,因此
dp[3][3]
=使用3 (
和有效序列S
數3 )
= 3 (
和3 )
有啥你的問題的有效後綴
Y
的數量? – 2014-09-22 10:01:38@WimOmbelets 我想,該算法解決上述問題 – Haris 2014-09-22 10:03:26