LeetCode 32
説明タイトル:
のみを含む文字列を考えると「(」と「」)、効果的な括弧を含んで最長の部分文字列の長さを見つけます。
例1:
入力: "(()"
出力:2
説明:最長部分文字列の有効括弧"()"
例2:
入力:「)()())」
出力:4を
説明する:最長部分文字列が有効なブラケットです「()()」
前の話題がある。この問題は、詳細はあなたがジャンプして、このリンクをクリックすることができLeetCode_20を、あなたは解決策を表示することができます私のCSDNのブログこのリチウムリチャード
少しアルゴリズムベースの学生がこの質問を見たとき、私の心の最初の考えは、私は結論が背後にあるという結論を起動する前に、それが使用されるべきであると思うので、問題を解決するためにDPを使用することですので、私たちDP直接メソッドを使用する方法について説明し
、我々は、各文字列の末尾に括弧の中で最も長い文字列の最初の有効長を書き、「))()()」などの文字列として
文字列の各文字 | ) | ( | ) | ( | ) |
---|---|---|---|---|---|
文字列の各文字 | 0 | 1 | 2 | 3 | 4 |
エンドブラケットの最長対応する文字の有効長 | 0 | 0 | 2 | 0 | 4 |
(以下、iは括弧内にLEN(I)のように文字列の位置の最大有効長さをいう。)
の文字)が理由について考える(I「(」、LEN(I)0肯定的な位置にある場合、計算中に
このあなたがlen(4)、それがあると「)」を計算しているとき、あなたは最初のlenはなっているはずです(「(」がある場合3)、(3)の位置を確認するために3-len文字を見つけることがあればLEN(4) = LEN(3)+2
ようにとの、我々はカウントしていないようです、我々は(4)2に等しいはずであるが、実際の状況は4と同じである必要があり、上記のアルゴリズムのLENに従うならば、我々は何かが欠けているように見える、。
戻って上記の分析に、我々さらに先に3-lenは(3)の位置を発見した後、lenの値が(3-lenは(3) -1)( ゼロではありません3-LEN(3)LEN前の文字の位置を意味します)、私たちはまた、(4)= LEN(3そうlenは、LENにこの位置を呼び出す必要があります )でlen + 2 +(3-LEN(3)-1)( クロスボーダー配列添字書かれた手順に注意を払っていない)
** *
したがって、初期の動的伝達方程式は、のように要約することができる:
[-I 1] [1-I-DPの[1-I] -1。] DP [I] DP = + 2 +のDP(これらは決まっていない初期方程式DP、ありますS [i]とS [I-1-DP [ I-1]] の場合)、
コードは次の通りです。
int longestValidParentheses(string s)
{
if (s==""||s.length()==0||s.length()==1)
{
return 0;
}
int len = s.length();
vector<int>dp(len,0);
for (int i = 0; i < len; i++)
{
if (i==0)
{
dp[i] = 0;
}
else
{
if (s.at(i) == '(')
{
dp[i] = 0;
}
else
{
//重点在这
int pre = i - 1 - dp[i - 1];
if (pre >= 0 && s[pre] == '(')
dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
}
}
}
sort(dp.begin(), dp.end());
return dp[len - 1];
}