Karena kita bisa mengabaikan semua karakter alfanumerik, kita akan menganggap string hanya berisi tanda kurung mulai sekarang. Seperti dalam pertanyaan, hanya ada satu jenis kurung, "()".
Jika kita terus menghapus tanda kurung yang seimbang sampai tidak ada lagi tanda kurung yang seimbang dapat dihapus, semua tanda kurung yang tersisa harus terlihat seperti ")) ...) ((...," yang semuanya tanda kurung tidak seimbang. Pengamatan ini menunjukkan bahwa kita harus menemukan terlebih dahulu titik balik itu) , sebelum itu kami hanya memiliki kurung tutup yang tidak seimbang dan setelah itu kami memiliki kurung pembuka yang tidak seimbang saja.
Di sini adalah algoritma. Singkatnya, ini menghitung titik balik pertama. Kemudian output kurung penutup ekstra, memindai string dari awal ke kanan hingga titik balik. Secara simetris, ini menghasilkan kurung pembuka ekstra, pemindaian dari ujung ke kiri sampai titik balik.
strn
Inisialisasi turning_point=0, maximum_count=0, count=0. Untuk setiap idari 0ke n-1melakukan hal berikut.
- Jika
str[i] = ')', tambahkan 1 ke count; jika tidak, kurangi 1.
- Jika
count > maximum_count, atur turning_point=idan maximum_count=count.
Sekarang turning_pointadalah indeks dari titik baliknya.
Setel ulang maximum_count=0, count=0. Untuk setiap idari 0ke turning_pointmelakukan hal berikut.
- Jika
str[i] = ')', tambahkan 1 ke count; jika tidak, kurangi 1.
- Jika
count > maximum_countdiatur maximum_count = count. Output isebagai indeks kurung tutup tidak seimbang.
Setel ulang maximum_count=0, count=0. Untuk setiap idari n-1ke turning_point+1bawah melakukan hal berikut.
- Jika
str[j] = '(', tambahkan 1 ke count; jika tidak, kurangi 1.
- Jika
count > maximum_countdiatur maximum_count = count. Output isebagai indeks kurung pembuka tidak seimbang.
O ( n )O(1)O(u)u
Jika kita menganalisis algoritma di atas, kita akan melihat bahwa, pada kenyataannya, kita tidak perlu menemukan dan menggunakan titik balik sama sekali. Pengamatan yang bagus bahwa semua kurung tutup tidak seimbang terjadi sebelum semua kurung buka tidak seimbang dapat diabaikan meskipun menarik.
Tekan saja "lari" untuk melihat beberapa hasil tes.
Latihan 1. Tunjukkan bahwa algoritma di atas akan menampilkan satu set tanda kurung dengan kardinalitas terkecil sehingga tanda kurung yang tersisa seimbang.
Masalah 1. Bisakah kita menggeneralisasi algoritma ke kasus ketika string berisi dua jenis tanda kurung seperti "() []"? Kita harus menentukan bagaimana mengenali dan memperlakukan situasi baru, kasus interleaving, "([)]".