Ponieważ możemy po prostu zignorować wszystkie znaki alfanumeryczne, założymy, że odtąd ciąg zawiera tylko nawiasy. Podobnie jak w pytaniu, istnieje tylko jeden rodzaj nawiasu, „()”.
Jeśli będziemy kontynuować usuwanie zrównoważonych nawiasów, dopóki nie będzie można usunąć więcej zrównoważonych nawiasów, wszystkie pozostałe nawiasy muszą wyglądać jak „))…) ((… (”, które są niezbalansowanymi nawiasami. Ta obserwacja sugeruje, że powinniśmy najpierw znaleźć ten punkt zwrotny) , przed którymi mamy tylko niezrównoważone nawiasy zamykające, a po których mamy niezrównoważone tylko nawiasy otwierające.
Oto algorytm. Krótko mówiąc, najpierw oblicza punkt zwrotny. Następnie generuje dodatkowy nawias zamykający, skanując ciąg od początku do prawej do punktu zwrotnego. Symetrycznie generuje dodatkowy nawias otwierający, skanując od końca do lewej do punktu zwrotnego.
Pozwolić str
n
Zainicjuj turning_point=0, maximum_count=0, count=0
. Dla każdego i
z 0
aby n-1
wykonać następujące czynności.
- Jeśli
str[i] = ')'
dodaj 1 do count
; w przeciwnym razie odejmij 1.
- Jeśli
count > maximum_count
, ustaw turning_point=i
i maximum_count=count
.
Teraz turning_point
jest indeks punktu zwrotnego.
Zresetować maximum_count=0, count=0
. Dla każdegoi
z 0
aby turning_point
wykonać następujące czynności.
- Jeśli
str[i] = ')'
dodaj 1 do count
; w przeciwnym razie odejmij 1.
- Jeśli
count > maximum_count
, ustawmaximum_count = count
. Dane wyjściowe i
jako indeks niezrównoważonego nawiasu zamykającego.
Zresetować maximum_count=0, count=0
. Dla każdego i
zn-1
do turning_point+1
dołu wykonaj następujące czynności.
- Jeśli
str[j] = '('
dodaj 1 do count
; w przeciwnym razie odejmij 1.
- Jeśli
count > maximum_count
, ustaw maximum_count = count
. Wyniki
jako indeks niezrównoważonego nawiasu otwierającego.
O(n)O(1)O(u)u
Jeśli przeanalizujemy powyższy algorytm, zobaczymy, że tak naprawdę wcale nie musimy znajdować punktu zwrotnego i korzystać z niego. Ładna obserwacja, że wszystkie niezrównoważone nawiasy zamykające mają miejsce, zanim wszystkie niezrównoważone nawiasy otwierające mogą zostać zignorowane, chociaż interesujące.
Wystarczy nacisnąć „Uruchom”, aby zobaczyć kilka wyników testu.
Ćwiczenie 1. Pokaż, że powyższy algorytm wyświetli zestaw nawiasów o najmniejszej liczności, tak aby pozostałe nawiasy były zrównoważone.
Problem 1. Czy możemy uogólnić algorytm na przypadek, gdy ciąg zawiera dwa rodzaje nawiasów, takie jak „() []”? Musimy ustalić, jak rozpoznać i potraktować nową sytuację, przypadek przeplatania, „([)]”.