Rumah > pembangunan bahagian belakang > C++ > Bilangan minimum aksara perlu dialih keluar untuk mengisih rentetan binari supaya ia berada dalam tertib menaik

Bilangan minimum aksara perlu dialih keluar untuk mengisih rentetan binari supaya ia berada dalam tertib menaik

WBOY
Lepaskan: 2023-09-08 22:49:02
ke hadapan
1343 orang telah melayarinya

Bilangan minimum aksara perlu dialih keluar untuk mengisih rentetan binari supaya ia berada dalam tertib menaik

Dalam sains komputer, manipulasi rentetan ialah topik penting, yang melibatkan operasi seperti penyambungan, subrentetan dan pembalikan. Masalah biasa yang berkaitan dengan manipulasi rentetan ialah mengalih keluar semua sifar daripada rentetan binari. Dalam artikel ini, kita akan membincangkan algoritma yang menggunakan bilangan minimum lakaran pasangan bukan bersebelahan untuk menyelesaikan masalah ini.

Pernyataan Masalah

Memandangkan rentetan binari, kita mesti mengalih keluar semua 0 dalam rentetan itu menggunakan bilangan minimum lilitan pasangan bukan bersebelahan. Flip ditakrifkan sebagai memilih dua aksara bersebelahan dan menukarnya. Dalam erti kata lain, kita perlu mencari bilangan lilitan minimum yang diperlukan untuk membawa semua 0 dalam rentetan ke hujung rentetan.

Kaedah

Kita boleh menggunakan algoritma tamak untuk menyelesaikan masalah ini. Kita boleh bermula di sebelah kiri rentetan dan menjejaki indeks terakhir di mana kita membalikkan 0 ke penghujung. Untuk setiap 0 yang ditemui, kami menukar kedudukannya dengan yang terakhir terbalik 0, mengalihkannya ke hujung rentetan. Jika 1 ditemui, kami hanya beralih ke indeks seterusnya.

Mari kita lihat algoritma secara terperinci -

  • Mulakan dua pembolehubah "lastFlipped" dan "flipCount" masing-masing kepada -1 dan 0.

  • Melintasi rentetan binari dari kiri ke kanan.

  • Jika aksara semasa ialah "0", tukar dengan aksara pada indeks "lastFlipped + 1" dan naikkan pembolehubah "lastFlipped".

  • Naikkan pembolehubah "flipCount" untuk setiap operasi swap.

  • Selepas traversal selesai, semua 0s akan berada di hujung rentetan dan "flipCount" akan mengandungi bilangan lilitan minimum yang diperlukan untuk mengeluarkan semua 0s.

Contoh

Ini ialah kod C++ yang digunakan untuk melaksanakan algoritma di atas -

#include <iostream>
#include <string>

using namespace std;

int minNonAdjacentPairFlips(string s) {
   int lastFlipped = -1;
   int flipCount = 0;
   
   for (int i = 0; i < s.length(); i++) {
      if (s[i] == '0') {
         swap(s[i], s[lastFlipped + 1]);
         lastFlipped++;
         flipCount++;
      }
   }
   
   return flipCount;
}

int main() {
   string s = "100101000";
   cout << "Binary String: " << s << endl;
   cout << "Minimum Non-adjacent Pair Flips: " << minNonAdjacentPairFlips(s) << endl;
   return 0;
}
Salin selepas log masuk

Output

Binary String: 100101000
Minimum Non-adjacent Pair Flips: 6
Salin selepas log masuk

Penjelasan kes ujian

Mari kita ambil rentetan binari "100101000" sebagai contoh. Kita mesti mengalih keluar semua 0 daripada rentetan menggunakan bilangan minimum lambungan pasangan bukan bersebelahan.

  • Pada mulanya, "lastFlipped" dan "flipCount" masing-masing ditetapkan kepada -1 dan 0.

  • Kami mula melintasi rentetan dari kiri ke kanan.

  • Pada indeks 1, kita menemui '0'. Kami menukarnya dengan aksara pada indeks "lastFlipped + 1" (iaitu indeks 0) dan menambah "lastFlipped" kepada 0. Rentetan menjadi "010101000". "flipCount" dinaikkan kepada 1.

  • Pada indeks 4 kita menemui satu lagi '0'. Kami menukarnya dengan aksara pada indeks "lastFlipped + 1" (iaitu indeks 1) dan menambah "lastFlipped" kepada 1. Rentetan menjadi "011010000". "flipCount" dinaikkan kepada 2.

  • Pada indeks 5, kita menghadapi '1'. Kami hanya beralih ke indeks seterusnya

Kesimpulan

Dalam artikel ini, kami membincangkan algoritma untuk mengalih keluar semua 0 daripada rentetan perduaan menggunakan bilangan minimum lilitan pasangan bukan bersebelahan. Pendekatan yang digunakan oleh algoritma ini adalah tamak, yang menjadikannya cekap dan mudah untuk dilaksanakan. Kami juga menyediakan kod C++ untuk melaksanakan algoritma bersama-sama dengan sampel kes ujian.

Masalah ini juga boleh diselesaikan menggunakan pengaturcaraan dinamik, tetapi algoritma tamak memberikan penyelesaian yang lebih mudah dan cepat. Kerumitan masa algoritma ini ialah O(n), dengan n ialah panjang rentetan binari.

Ringkasnya, algoritma membalik pasangan bukan bersebelahan minimum ialah alat yang berguna dalam operasi rentetan dan boleh digunakan untuk pelbagai situasi.

Atas ialah kandungan terperinci Bilangan minimum aksara perlu dialih keluar untuk mengisih rentetan binari supaya ia berada dalam tertib menaik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:tutorialspoint.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan