Leetcode 32の最長アクティブブラケット

 

 ソリューション:要件はここに文字列ではなく、サブシーケンス、間隔DP不適切であるとして。終了最長弦の有効長さSである[I]表す[I] DPを規定考えます。S [i]は[i]が時間 "("、DP = 0であれば、分類を議論します。

フロント、S [I-1] == '(' DPを考慮した場合、S [i]には ")" であれば、[I] = 2 + DP [I-2]、S [ならI- 1]の場合== '')のに参照する[I-1]ではない文字列のフロントエンドである '(' はいDP [I] = 2 + DP [I-1] + DP [ I-DP [I-1] -2]。

次のようにACコードは次のとおりです。

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include < 文字列 > 
の#include <CStringの>
 使用して 名前空間はstdを、

int型の DP [ 100010 ]。
INT longestValidParentheses(ストリングS)
{ 
    int型レン= s.length()。
    memsetの(DP、0はsizeof (DP))。
    int型のmx = - 1 ;
    INT iは= 1 ; I <レンI ++ 
    { 
        もし、(S [I] == ' ' 
        { 
            もし、(S [I- 1 ] == ' ' 
            { 
                DP [I] = 2 ;
                 もし(I- 2 > = 0 
                    DP [I] + = DP [I- 2 ]; 
            } 
            
            { 
                もし(S [I-DP [I- 1 ] - 1 ] == ' ' 
                { 
                    DP [I] = 2 + DP [I- 1];
                    もし(I-DP [I- 1 ] - 2 > = 0 
                        DP [I] + = DP [I-DP [I- 1 ] - 2 ]。
                } 
            } 
        } 
        MX = MAX(DP [i]は、MX)。
    } 

    ためINT iは= 0 ; I <レン; I ++)COUT << DP [I] << "  " 
    coutの << てendl;
    リターンMX。
} 
int型のmain()
{ 

    文字列 S = " ()(())"; 
    COUT << longestValidParentheses(S)<< ENDL。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/z1141000271/p/12141612.html