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.
strn
Başlat turning_point=0, maximum_count=0, count=0. Her biri için igelen 0için n-1aşağıdakileri yapın.
- Eğer
str[i] = ')', 1 count; aksi takdirde 1 çıkarın.
- Eğer
count > maximum_count, turning_point=ive öğelerini ayarlayın maximum_count=count.
Şimdi turning_pointdönüm noktasının endeksi.
Sıfırla maximum_count=0, count=0. Her biri için igelen 0için turning_pointaşağıdakileri yapın.
- Eğer
str[i] = ')', 1 count; aksi takdirde 1 çıkarın.
- Varsa
count > maximum_countayarlayın maximum_count = count. iDengesiz bir kapanış parantezinin dizini olarak çıktı .
Sıfırla maximum_count=0, count=0. Her biri için igelen n-1için turning_point+1aşağıya aşağıdakileri yapın.
- Eğer
str[j] = '(', 1 count; aksi takdirde 1 çıkarın.
- Varsa
count > maximum_countayarlayın maximum_count = count. iDengesiz 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.