タイトル最長の効果的なブラケット32 leetcode

タイトル

のみを含む文字列「(」と「」)指定された、最長有効括弧を含む部分文字列の長さを見つけます。

例1:

入力: "(()"
出力:2
説明:最長は効果的な括弧をサブストリング"()"

例2:

入力: ")()())"
出力:4
説明:最長のサブストリングの有効括弧を"()()"

(leetcodeの公式から以下の問題の解決策のアイデア)

アイデアのスタックを使用します

最初-1スタックに追加される(-1など、文字列の長さを計算します「(()))」)。私たちは、最大、ご滞在に比べて、値を取得するには、直接アウトスタック、その後、現在のインデックスマイナススタックの現在のトップの「「(」出会いのインデックスをプッシュする)」に遭遇文字列を、横断を開始するために使用しました最大のもの。

例アルゴリズム( ")()())")の例としてここに画像を挿入説明

コードを考えます

public class problem32 {
	public int longestValidParentheses(String s) {
		int max=0;
		Stack<Integer> st=new Stack<Integer>();
		st.push(-1);
		
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='('){
				st.push(i);
			}else{
				st.pop();
				if(st.isEmpty()){
					st.push(i);
				}else{
					max=Math.max(max, i-st.peek());
				}
			}
		}
		
		return max;
    }
	public static void main(String[] args) {
		problem32 pro=new problem32();
		System.out.println(pro.longestValidParentheses(")()())"));
	}
}

2つの動的なプログラミングのアイデア

この問題は、動的計画法によって解くことができます。我々は、i番目の要素は、Iを終了する文字ストリングの最も長い有効長を付し、以下で表される、請求DPアレイを定義します。我々は、すべてゼロに初期化配列をDPます。さて、ある特定の部分文字列「)」末端で明らかに効果的。このさらなる結論が引き出されることができます:「(」私達はちょうど更新する必要があるので、サブストリングの終わりに対応するDPアレイ位置での値は0でなければなりません。「)」の配列DP内の位置の値に対応します。

以下に、溶液プロセスDPアレイである:
1、S [I] = ")" && S [I-1] = "("形である時、 "...()"
DP [I] = DP [I-2] +2、
前記DPは[I-2]「(」サブストリングの有効長さの前に、2の長さは新しいストリングを「()」表し

2、S [I] = " )" && S [I-1] = ")" 、のような形をしている"...))"
DP [I]は= DP [I-1] + DP [I-DP [I -1] -2] + 2;
DPは[I-1]サブストリングの有効長さの前に")"を表し、前記2つの意味サブストリング新しい"()"の長さで、DP [I-DP [I-1]は-2]を示し、このセクション:
このセクション((...))

3、S [i]は= "("、スキップ

それはすでに考慮されていないが、我々は国境の問題に注目するだけでなく、いくつかの取引はなかった、これらのルールの追加は、プロセスを移動する非常に複雑になるように、何があるされたときに、いくつかのアルゴリズムを検討している一方、実際には、物事の細部の多くは、もありますそれはゆっくりとそれを自分自身の理解を描くのがベストですので、に参加。

規制コードを移動

public class problem32_2 {
	public int longestValidParentheses(String s) {
		int max = 0;
		int dp[] = new int[s.length()];

		for (int i = 1; i < s.length(); i++) {
			if (s.charAt(i) == ')') {
				if (s.charAt(i - 1) == '(') {
					dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
				} else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
					dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
				}
			}
			max = Math.max(max, dp[i]);
		}

		return max;
	}
	public static void main(String[] args) {
		problem32_2 pro=new problem32_2();
		System.out.println(pro.longestValidParentheses("(()))"));
	}
}
公開された15元の記事 ウォンの賞賛0 ビュー175

おすすめ

転載: blog.csdn.net/qq_36360463/article/details/104029439