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.
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.
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.
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; }
Binary String: 100101000 Minimum Non-adjacent Pair Flips: 6
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
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!