首页 后端开发 php教程 使琴弦平衡的最少交换次数

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

Oct 09, 2024 am 06:08 AM

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

<?php
/**
 * @param String $s
 * @return Integer
 */
function minSwaps($s) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

// Example usage:
$s1 = "][][";
echo minSwaps($s1); // Output: 1

$s2 = "]]][[[";
echo minSwaps($s2); // Output: 2

$s3 = "[]";
echo minSwaps($s3); // Output: 0
?>




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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

11个最佳PHP URL缩短脚本(免费和高级) 11个最佳PHP URL缩短脚本(免费和高级) Mar 03, 2025 am 10:49 AM

11个最佳PHP URL缩短脚本(免费和高级)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

在Laravel中使用Flash会话数据

Instagram API简介 Instagram API简介 Mar 02, 2025 am 09:32 AM

Instagram API简介

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

简化的HTTP响应在Laravel测试中模拟了

构建具有Laravel后端的React应用程序:第2部分,React 构建具有Laravel后端的React应用程序:第2部分,React Mar 04, 2025 am 09:33 AM

构建具有Laravel后端的React应用程序:第2部分,React

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

php中的卷曲:如何在REST API中使用PHP卷曲扩展

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

在Codecanyon上的12个最佳PHP聊天脚本

Laravel中的通知 Laravel中的通知 Mar 04, 2025 am 09:22 AM

Laravel中的通知

See all articles