与えられた質問:
文字列の左括弧と右括弧を適切にペアリングできる場合、括弧の文字列はバランスが取れていると言われます。たとえば、文字列 "(())"と "()()"は両方ともバランスが取れていますが、文字列 "(()("はバランスが取れていません。括弧で構成される長さn
の文字列Sが与えられた場合、次のようになります。バランスの取れたSの最長のサブシーケンスを見つける動的計画法を使用して、O(n ^ 3)時間でSの最長のバランスの取れたサブシーケンスを見つけるアルゴリズムを設計します。
私のアプローチ:
与えられた文字列を仮定します:S [1 2 ... n]
S [i] ==')'の場合、有効なサブシーケンスはS[i]で終了できます。 S[i]の前に少なくとも1つの未使用のオープニングブレース。これはO(N)で実装できます。
#include<iostream>
using namespace std;
int main(){
string s;
cin >> s;
int n = s.length(), o_count = 0, len = 0;
for(int i=0; i<n; ++i){
if(s[i] == '('){
++o_count;
continue;
}
else if(s[i] == ')' && o_count > 0){
++len;
--o_count;
}
}
cout << len << endl;
return 0;
}
いくつかのテストケースを試しましたが、正常に機能しているようです。ここで何かが足りませんか?そうでない場合、この問題のO(n ^ 3)動的計画法ソリューションを設計するにはどうすればよいですか?これは私が使用しているサブシーケンス
の定義です。
ありがとう!