質問:
文字列から余分な括弧を削除します。
例えば
((a+b))*c => (a+b)*c
(a+b)+c => (a+b)+c
((a+b)/(c+d)) => ((a+b)/(c+d))
(a+(((b-c)))*d) => (a+(b-c)*d) and so on.
私は次の解決策を思いつきました:
アプローチ: 文字列をスキャンし、(マップを使用して) 左括弧のインデックスと、それが余分かどうか (デフォルトでは余分です) を覚えています。閉じ括弧が見つかった場合は、マップから対応する開き括弧を確認し、余分な場合は両方を削除します。
void removeExtraParentheses(string& S){
map<int, bool> pmap;
for(int i = 0; i < S.size(); i++){
map<int, bool>::iterator it;
if(S.at(i) == '('){
pmap[i] = true;
}
else if(S.at(i) == ')'){
it = pmap.end();
it--;
if(!(*it).second){
pmap.erase(it);
}
else{
S.erase(S.begin() + i);
S.erase(S.begin() + (*it).first);
pmap.erase(it);
i = i - 2;
}
}
else{
if(!pmap.empty()){
it = pmap.end();
it--;
(*it).second= false;
}
}
}
}
時間の複雑さ: O(n2)
スペース: O(n)
余分なストレージを使用し、二次時間で実行しているため、ソリューションにあまり満足していません。
これを O(n) 時間と O(1) 空間で実行できるでしょうか? そうでない場合、何ができるのが最善ですか?