Tüm alfasayısal karakterleri yok sayabileceğimiz için, dizenin bundan böyle yalnızca parantez içerdiğini varsayacağız. Soruda olduğu gibi, sadece bir tür parantez vardır ("()".
Dengeli parantez kaldırılıncaya kadar dengeli parantezleri kaldırmaya devam edersek, geriye kalan tüm parantezler "))…) () (hepsi dengesiz parantez olan) gibi görünmelidir. daha önce sadece dengesiz kapanış parantezlerimiz var ve bundan sonra sadece dengesiz açılış parantezlerimiz var.
İşte algoritma. Özetle, önce dönüm noktasını hesaplar. Daha sonra, dizeyi başlangıçtan sağa dönme noktasına kadar tarayarak ekstra kapanış parantezi çıkarır. Simetrik olarak, uçtan sola dönme noktasına kadar tarayarak ekstra açılış parantezi çıkarır.
str
n
Başlat turning_point=0, maximum_count=0, count=0
. Her biri için i
gelen 0
için n-1
aşağıdakileri yapın.
- Eğer
str[i] = ')'
, 1 count
; aksi takdirde 1 çıkarın.
- Eğer
count > maximum_count
, turning_point=i
ve öğelerini ayarlayın maximum_count=count
.
Şimdi turning_point
dönüm noktasının endeksi.
Sıfırla maximum_count=0, count=0
. Her biri için i
gelen 0
için turning_point
aşağıdakileri yapın.
- Eğer
str[i] = ')'
, 1 count
; aksi takdirde 1 çıkarın.
- Varsa
count > maximum_count
ayarlayın maximum_count = count
. i
Dengesiz bir kapanış parantezinin dizini olarak çıktı .
Sıfırla maximum_count=0, count=0
. Her biri için i
gelen n-1
için turning_point+1
aşağıya aşağıdakileri yapın.
- Eğer
str[j] = '('
, 1 count
; aksi takdirde 1 çıkarın.
- Varsa
count > maximum_count
ayarlayın maximum_count = count
. i
Dengesiz bir açılış parantezinin indeksi olarak çıktı .
O(n)O(1)O(u)u
Yukarıdaki algoritmayı analiz edersek, aslında dönüm noktasını bulmamız ve kullanmamız gerekmediğini göreceğiz. Tüm dengesiz kapanış parantezlerinin tüm dengesiz açılış parantezlerinin ilginç olmasına rağmen göz ardı edilmesinden önce gerçekleştiği iyi bir gözlemdir.
Birkaç test sonucunu görmek için "run" düğmesine basmanız yeterli.
Alıştırma 1. Yukarıdaki algoritmanın en az kardinaliteye sahip bir dizi parantez çıkacağını gösterin, böylece kalan parantezler dengelenir.
Sorun 1. Dizenin "() []" gibi iki tür parantez içerdiği durumlarda algoritmayı duruma göre genelleştirebilir miyiz? Yeni durumu, serpiştirme vakasını "([)]" nasıl tanıyacağımızı ve tedavi edeceğimizi belirlemeliyiz.