Como podemos simplesmente ignorar todos os caracteres alfanuméricos, assumiremos que a sequência contém apenas parênteses a partir de agora. Como na pergunta, existe apenas um tipo de parêntese, "()".
Se continuarmos removendo parênteses balanceados até que nenhum parêntese mais balanceado possa ser removido, todos os parênteses restantes deverão se parecer com ")) ...) ((… (", que são todos parênteses desequilibrados. Esta observação sugere que devemos encontrar primeiro esse ponto de virada) , antes do qual temos apenas parênteses de fechamento desequilibrados e depois dos quais temos apenas parênteses de abertura desequilibrados.
Aqui está o algoritmo. Em poucas palavras, ele calcula o ponto de viragem primeiro. Em seguida, ele gera parênteses de fechamento extra, varrendo a corda do início para a direita até o ponto de virada. Simetricamente, ele gera parênteses de abertura extra, digitalizando do final para a esquerda até o ponto de virada.
str
n
Inicialize turning_point=0, maximum_count=0, count=0
. Para cada i
a partir 0
de n-1
fazer o seguinte.
- Se
str[i] = ')'
, adicione 1 a count
; caso contrário, subtraia 1.
- Se
count > maximum_count
, defina turning_point=i
e maximum_count=count
.
Agora turning_point
é o índice do ponto de virada.
Reset maximum_count=0, count=0
. Para cada i
a partir 0
de turning_point
fazer o seguinte.
- Se
str[i] = ')'
, adicione 1 a count
; caso contrário, subtraia 1.
- Se
count > maximum_count
definir maximum_count = count
. Saída i
como o índice de um parêntese de fechamento desequilibrado.
Reset maximum_count=0, count=0
. Para cada um i
de n-1
para turning_point+1
baixo, faça o seguinte.
- Se
str[j] = '('
, adicione 1 a count
; caso contrário, subtraia 1.
- Se
count > maximum_count
definir maximum_count = count
. Saída i
como o índice de um parêntese de abertura desequilibrada.
O ( n )O ( 1 )O ( u )você
Se analisarmos o algoritmo acima, veremos que, de fato, não precisamos encontrar nem usar o ponto de virada. A boa observação de que todos os parênteses de fechamento desequilibrados ocorre antes que todos os parênteses de abertura desequilibrados possam ser ignorados, embora interessantes.
Basta clicar em "executar" para ver vários resultados do teste.
Exercício 1. Mostre que o algoritmo acima produzirá um conjunto de parênteses com a menor cardinalidade, de forma que os parênteses restantes sejam balanceados.
Problema 1. Podemos generalizar o algoritmo para o caso em que a cadeia contém dois tipos de parênteses, como "() []"? Temos que determinar como reconhecer e tratar a nova situação, o caso intercalado, "([)]".