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ć strn
Zainicjuj turning_point=0, maximum_count=0, count=0. Dla każdego iz 0aby n-1wykonać 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=ii maximum_count=count.
Teraz turning_pointjest indeks punktu zwrotnego.
Zresetować maximum_count=0, count=0. Dla każdegoi z 0aby turning_pointwykonać 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 ijako indeks niezrównoważonego nawiasu zamykającego.
Zresetować maximum_count=0, count=0. Dla każdego izn-1 do turning_point+1doł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, „([)]”.