使琴弦平衡的最少交换次数

Susan Sarandon
发布: 2024-10-09 06:08:02
原创
170 人浏览过

Minimum Number of Swaps to Make the String Balanced

1963. Bilangan Minimum Pertukaran untuk Menjadikan Rentetan Seimbang

Kesukaran: Sederhana

Topik: Dua Penunjuk, Rentetan, Tindanan, Tamak

Anda diberi 0-diindeks rentetan s genap panjang n. Rentetan terdiri daripada tepat n / 2 kurungan pembukaan '[' dan n / 2 kurungan penutup ']'.

Rentetan dipanggil seimbang jika dan hanya jika:

  • Ia adalah rentetan kosong, atau
  • Ia boleh ditulis sebagai AB, di mana kedua-dua A dan B ialah seimbang rentetan, atau
  • Ia boleh ditulis sebagai [C], dengan C ialah rentetan seimbang.

Anda boleh menukar kurungan pada mana-mana dua indeks mana-mana bilangan kali.

Kembalikan bilangan minimum swap untuk menjadikan s seimbang.

Contoh 1:

  • Input: s = "][][]["
  • Output: 1
  • Penjelasan: Anda boleh membuat rentetan seimbang dengan menukar indeks 0 dengan indeks 3.
    • Rentetan yang terhasil ialah "[[]]".

Contoh 2:

  • Input: s = "]]][[["
  • Output: 2
  • Penjelasan: Anda boleh melakukan perkara berikut untuk menjadikan rentetan seimbang:
    • Tukar indeks 0 dengan indeks 4. s = "[]][][".
    • Tukar indeks 1 dengan indeks 5. s = "[[][]]".
    • Rentetan yang terhasil ialah "[[][]]".

Contoh 3:

  • Input: s = "[]"
  • Output: 0
  • Penjelasan: Rentetan sudah seimbang.

Kekangan:

  • n == s.panjang
  • 2 <= n <= 106
  • n adalah genap.
  • s[i] ialah sama ada '[' atau ']'.
  • Bilangan kurungan pembukaan '[' bersamaan dengan n / 2, dan bilangan kurungan penutup ']' bersamaan dengan n / 2.

Petunjuk:

  1. Lelaran pada rentetan dan jejaki bilangan kurungan pembukaan dan penutup pada setiap langkah.
  2. Jika bilangan kurungan penutup semakin besar, anda perlu membuat pertukaran.
  3. Tukarnya dengan kurungan bukaan yang paling hampir dengan penghujung s.

Penyelesaian:

Kita boleh menggunakan pendekatan dua mata, yang cekap memandangkan kekangan.

Pendekatan:

  1. Imbangan Jejak: Sambil kita mengulangi rentetan, kita boleh menjejaki keseimbangan antara kurungan pembukaan dan penutup:

    • Naikkan baki apabila menemui '['.
    • Kurangkan baki apabila menemui ']'.
  2. Kenalpasti Ketidakseimbangan: Apabila baki menjadi negatif, ini menunjukkan bahawa terdapat lebih banyak kurungan penutup ']' daripada kurungan pembukaan '[' pada titik itu dalam rentetan. Di sinilah kita perlu menukar kurungan untuk menjadikan rentetan seimbang.

  3. Pertukaran Kira: Untuk membetulkan ketidakseimbangan:

    • Simpan ketidakseimbangan maks_kaunter untuk menjejaki ketidakseimbangan maksimum yang diperhatikan semasa lelaran.
    • Bilangan swap yang diperlukan adalah sama dengan (max_imbalance 1) / 2, yang secara berkesan memberikan bilangan swap minimum yang diperlukan untuk menjadikan rentetan seimbang.

Mari laksanakan penyelesaian ini dalam PHP: 1963. Bilangan Minimum Pertukaran untuk Menjadikan Rentetan Seimbang






Penjelasan:

  1. Penjejakan Baki:

    • baki menjejaki perbezaan antara bilangan '[' dan ']'.
    • Jika baki menjadi negatif, ini menunjukkan bahawa terdapat lebih banyak ']' daripada '[' pada ketika itu.
  2. Kira Ketidakseimbangan Maksimum:

    • max_imbalance menyimpan ketidakseimbangan terbesar yang dihadapi semasa lelaran.
    • Jika baki menjadi negatif, kemas kini max_imbalance dengan max_imbalance atau -balance yang lebih besar.
  3. Kira Swap:

    • Untuk membetulkan ketidakseimbangan, pertukaran minimum yang diperlukan ialah (ketidakseimbangan_maks 1) / 2.

Kerumitan Masa:

  • Kerumitan masa ialah O(n), dengan n ialah panjang rentetan. Kami mengulangi rentetan sekali untuk menentukan ketidakseimbangan_maks.
  • Kerumitan ruang ialah O(1) kerana kami menggunakan beberapa pembolehubah untuk menjejaki keseimbangan dan ketidakseimbangan maksimum.

Penyelesaian ini memastikan kami memenuhi kekangan, walaupun untuk input yang besar.

Pautan Kenalan

如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!

如果您想要更多类似的有用内容,请随时关注我:

  • 领英
  • GitHub

以上是使琴弦平衡的最少交换次数的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!