すべての英数字を無視できるので、今後は文字列に括弧のみが含まれると想定します。質問のように、括弧の種類は "()"のみです。
バランスのとれた括弧が削除できなくなるまでバランスの括弧を削除し続けると、残りの括弧はすべて "))…)((…("のようになります。これらはすべて非括弧の括弧です。この観察から、最初にターニングポイントを見つける必要があることがわかります。 、その前に不均等な閉じ括弧のみがあり、その後に不均等な開き括弧のみがある。
これがアルゴリズムです。簡単に言えば、最初にターニングポイントを計算します。次に、追加の閉じかっこを出力し、文字列を最初から右に向かって分岐点までスキャンします。対称的に、それは余分な左括弧を出力し、最後から左に転換点までスキャンします。
してみましょうstrサイズで文字の配列として文字列で。n
初期化turning_point=0, maximum_count=0, count=0。それぞれのifrom について、以下0をn-1実行します。
- もし
str[i] = ')'に1を追加し、count。それ以外の場合は、1を引きます。
- の場合
count > maximum_count、turning_point=iおよびを設定しmaximum_count=countます。
今turning_pointがターニングポイントの指標です。
リセットmaximum_count=0, count=0。それぞれのifrom について、以下0をturning_point実行します。
- もし
str[i] = ')'に1を追加し、count。それ以外の場合は、1を引きます。
- の場合
count > maximum_count、設定しmaximum_count = countます。iアンバランスな閉じ括弧のインデックスとして出力されます。
リセットmaximum_count=0, count=0。各ifrom n-1からturning_point+1downsに対して、次のことを行います。
- もし
str[j] = '('に1を追加し、count。それ以外の場合は、1を引きます。
- の場合
count > maximum_count、設定しmaximum_count = countます。iアンバランスな開き括弧のインデックスとして出力されます。
アルゴリズムが時間および補助メモリと出力メモリで実行されることは明らかです。ここで、は不平衡括弧の数です。O(n)O(1)O(u)u
上記のアルゴリズムを分析すると、実際にはターニングポイントを見つけて使用する必要がないことがわかります。興味深いことに、すべての不均等な開き括弧が無視される前に、すべての不均等な閉じ括弧が発生するという素晴らしい観察結果があります。
「実行」を押すだけで、いくつかのテスト結果が表示されます。
演習1.上記のアルゴリズムがカーディナリティが最小の括弧のセットを出力し、残りの括弧のバランスをとることを示します。
問題1.文字列に「()[]」などの2種類の括弧が含まれる場合にアルゴリズムを一般化できますか?新しい状況であるインターリーブの場合の "([)]"を認識して処理する方法を決定する必要があります。