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.
strn
Inicialize turning_point=0, maximum_count=0, count=0. Para cada ia partir 0de n-1fazer o seguinte.
- Se
str[i] = ')', adicione 1 a count; caso contrário, subtraia 1.
- Se
count > maximum_count, defina turning_point=ie maximum_count=count.
Agora turning_pointé o índice do ponto de virada.
Reset maximum_count=0, count=0. Para cada ia partir 0de turning_pointfazer o seguinte.
- Se
str[i] = ')', adicione 1 a count; caso contrário, subtraia 1.
- Se
count > maximum_countdefinir maximum_count = count. Saída icomo o índice de um parêntese de fechamento desequilibrado.
Reset maximum_count=0, count=0. Para cada um ide n-1para turning_point+1baixo, faça o seguinte.
- Se
str[j] = '(', adicione 1 a count; caso contrário, subtraia 1.
- Se
count > maximum_countdefinir maximum_count = count. Saída icomo 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, "([)]".