Rumah > pembangunan bahagian belakang > tutorial php > Skor Maksimum Selepas Membahagikan Rentetan

Skor Maksimum Selepas Membahagikan Rentetan

Mary-Kate Olsen
Lepaskan: 2025-01-03 22:32:41
asal
248 orang telah melayarinya

Maximum Score After Splitting a String

1422. Markah Maksimum Selepas Membahagikan Rentetan

Kesukaran: Mudah

Topik: Rentetan, Jumlah Awalan

Diberi rentetan sifar dan satu, kembalikan skor maksimum selepas membahagikan rentetan kepada dua tak kosong subrentetan (iaitu kiri subrentetan dan kanan subrentetan).

Skor selepas membelah rentetan ialah bilangan sifar dalam subrentetan kiri ditambah dengan bilangan satu di kanan subrentetan.

Contoh 1:

  • Input: s = "011101"
  • Output: 5
  • Penjelasan: Semua cara yang mungkin untuk memisahkan s kepada dua subrentetan bukan kosong ialah:
    • kiri = "0" dan kanan = "11101", skor = 1 4 = 5
    • kiri = "01" dan kanan = "1101", skor = 1 3 = 4
    • kiri = "011" dan kanan = "101", skor = 1 2 = 3
    • kiri = "0111" dan kanan = "01", skor = 1 1 = 2
    • kiri = "01110" dan kanan = "1", skor = 2 1 = 3

Contoh 2:

  • Input: s = "00111"
  • Output: 5
  • Penjelasan: Apabila kiri = "00" dan kanan = "111", kita mendapat markah maksimum = 2 3 = 5

Contoh 3:

  • Input: s = "1111"
  • Output: 3

Kekangan:

  • 2 <= s.panjang <= 500
  • Rentetan s terdiri daripada aksara '0' dan '1' sahaja.

Petunjuk:

  1. Prahitung jumlah awalan satu ('1').
  2. Lelaran dari kiri ke kanan mengira bilangan sifar ('0'), kemudian gunakan jumlah awalan yang diprakira untuk mengira satu ('1'). Kemas kini jawapan.

Penyelesaian:

Kita boleh memanfaatkan pembayang yang diberikan dengan membuat prapengiraan jumlah awalan satu ('1') dalam rentetan. Begini cara kita boleh memecahkan penyelesaiannya:

Langkah-langkah:

  1. Jumlah awalan satu: Prakirakan tatasusunan di mana setiap elemen pada indeks i mengandungi bilangan satu ('1') sehingga indeks i dalam rentetan.
  2. Lelaran pada rentetan: Untuk setiap kedudukan i, layan subrentetan daripada 0 kepada i sebagai subrentetan "kiri" dan dari i 1 hingga hujung rentetan sebagai subrentetan "kanan".
    • Kira sifar dalam subrentetan kiri dengan hanya mengiranya semasa anda berulang.
    • Gunakan jumlah awalan untuk mengira yang dalam subrentetan kanan (dengan menolak jumlah awalan pada titik pisah daripada jumlah kiraan satu dalam rentetan).
  3. Kira skor: Untuk setiap pemisahan yang mungkin, hitung skor sebagai bilangan sifar dalam subrentetan kiri ditambah bilangan satu dalam subrentetan kanan.
  4. Kembalikan markah maksimum.

Mari laksanakan penyelesaian ini dalam PHP: 1422. Markah Maksimum Selepas Membahagikan Rentetan

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

// Test cases
$s1 = "011101";
$s2 = "00111";
$s3 = "1111";

echo "Input: $s1, Output: " . maxScore($s1) . PHP_EOL; // Output: 5
echo "Input: $s2, Output: " . maxScore($s2) . PHP_EOL; // Output: 5
echo "Input: $s3, Output: " . maxScore($s3) . PHP_EOL; // Output: 3
?>




<h3>
  
  
  Penjelasan:
</h3>

<ol>
<li><p><strong>Pengiraan jumlah awalan</strong>: Kami mengira jumlah awalan satu dalam tatasusunan $prefixOneCount, di mana setiap indeks menyimpan kiraan terkumpul satu sehingga titik itu.</p></li>
<li>
<p><strong>Meletup atas kemungkinan pemisahan</strong>: Kami mula mengulangi setiap indeks i (dari 0 hingga n-2), di mana rentetan dipecahkan kepada bahagian kiri (dari 0 hingga i) dan bahagian kanan ( dari i 1 hingga n-1).</p>

<ul>
<li>Untuk setiap pemisahan, kira sifar dalam subrentetan kiri ($zeroCountLeft).</li>
<li>Gunakan $prefixOneCount yang diprakira untuk mengira bilangan yang berada dalam subrentetan yang betul.</li>
</ul>
</li>
<li><p><strong>Pengiraan skor</strong>: Markah untuk setiap pemisahan dikira sebagai jumlah sifar di bahagian kiri dan satu di bahagian kanan. Kami mengemas kini skor maksimum yang ditemui semasa lelaran ini.</p></li>
<li><p><strong>Keputusan akhir</strong>: Fungsi mengembalikan markah maksimum yang ditemui semasa semua pemisahan.</p></li>
</ol>

<h3>
  
  
  Kerumitan:
</h3>

<ul>
<li>
<p><strong>Kerumitan Masa</strong>: <em><strong>O(n)</strong></em></p>

<ul>
<li>Prapengiraan jumlah awalan dan lelaran melalui rentetan kedua-duanya mengambil masa <em><strong>O(n)</strong></em>.</li>
<li>Lelaran melalui rentetan untuk mengira markah juga memerlukan O(n).</li>
<li>Oleh itu, jumlah kerumitan masa ialah O(n), yang cekap untuk saiz input yang diberikan (n ≤ 500).</li>
</ul>


</li>

<li>

<p><strong>Kerumitan Angkasa</strong>: <em><strong>O(n)</strong></em></p>

<ul>
<li>Susun atur jumlah awalan memerlukan <em><strong>O(n)</strong></em> ruang tambahan.</li>
</ul>


</li>

</ul>

<h3>
  
  
  Contoh:
</h3>



<pre class="brush:php;toolbar:false">echo maxScore("011101"); // Output: 5
echo maxScore("00111");  // Output: 5
echo maxScore("1111");   // Output: 3
Salin selepas log masuk

Penyelesaian ini adalah optimum dan menangani masalah dalam kekangan.

Pautan Kenalan

Jika anda mendapati siri ini membantu, sila pertimbangkan untuk memberi repositori bintang di GitHub atau berkongsi siaran pada rangkaian sosial kegemaran anda ?. Sokongan anda amat bermakna bagi saya!

Jika anda mahukan kandungan yang lebih berguna seperti ini, sila ikuti saya:

  • LinkedIn
  • GitHub

Atas ialah kandungan terperinci Skor Maksimum Selepas Membahagikan Rentetan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan