1639. Bilangan Cara Membentuk Rentetan Sasaran Diberi Kamus
Kesukaran: Sukar
Topik: Tatasusunan, Rentetan, Pengaturcaraan Dinamik
Anda diberi senarai rentetan perkataan sama panjang dan sasaran rentetan.
Tugas anda adalah untuk membentuk sasaran menggunakan perkataan yang diberikan di bawah peraturan berikut:
Notis bahawa anda boleh menggunakan berbilang aksara daripada rentetan yang sama dalam perkataan dengan syarat syarat di atas dipenuhi.
Kembalikan bilangan cara untuk membentuk sasaran daripada perkataan. Oleh kerana jawapannya mungkin terlalu besar, kembalikannya modulo 109 7.
Contoh 1:
Contoh 2:
Kekangan:
Petunjuk:
Penyelesaian:
Masalahnya memerlukan mencari bilangan cara untuk membentuk rentetan sasaran daripada kamus perkataan, mengikut peraturan khusus tentang penggunaan aksara. Ini ialah masalah gabungan yang boleh diselesaikan dengan cekap menggunakan Pengaturcaraan Dinamik (DP) dan prapemprosesan frekuensi aksara.
Penyelesaian menggunakan:
Langkah:
Mari laksanakan penyelesaian ini dalam PHP: 1639. Bilangan Cara Membentuk Rentetan Sasaran Diberi Kamus
Penjelasan:
Langkah Prapemprosesan:
- Bina tatasusunan kiraan:
- Untuk setiap lajur dalam perkataan, kira kejadian setiap aksara.
- Contoh: Jika perkataan = ["acca", "bbbb", "caca"], untuk lajur pertama, dikira[0] = {'a': 1, 'b': 1, 'c': 1 }.
DP rekursif:
- Tentukan dp(i, j):
- i ialah indeks semasa dalam sasaran.
- j ialah kedudukan semasa dalam perkataan.
- Kes Asas:
- Jika i == len(sasaran): Keseluruhan sasaran terbentuk → pulangkan 1.
- Jika j == len(perkataan[0]): Tiada lagi lajur untuk digunakan → kembalikan 0.
- Berulang:
- Pilihan 1: Gunakan kiraan[j][sasaran[i]] aksara daripada kedudukan j.
- Pilihan 2: Langkau kedudukan j.
Pengoptimuman:
- Gunakan jadual hafalan untuk menyimpan hasil submasalah yang bertindih.
Contoh Panduan
Input:
perkataan = ["acca", "bbbb", "caca"], sasaran = "aba"
Prapemprosesan:
- kiraan[0] = {'a': 2, 'b': 0, 'c': 1}
- kiraan[1] = {'a': 0, 'b': 3, 'c': 0}
- kiraan[2] = {'a': 1, 'b': 0, 'c': 2}
- kiraan[3] = {'a': 2, 'b': 0, 'c': 1}
Pengiraan DP:
- dp(0, 0): Berapa banyak cara untuk membentuk "aba" bermula dari lajur 0.
- Kira secara rekursif, menggabungkan penggunaan kiraan dan melangkau lajur.
Output: 6
Kerumitan Masa
- Praproses: O(n x m), dengan n ialah bilangan perkataan dan m ialah panjangnya.
- Pengaturcaraan Dinamik: O(l x m), dengan l ialah panjang sasaran.
- Jumlah: O(n x m l x m).
Output sebagai Contoh
Masalah ini ialah contoh yang bagus untuk menggabungkan prapemprosesan dan pengaturcaraan dinamik untuk menyelesaikan cabaran gabungan dengan cekap.
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:
Atas ialah kandungan terperinci Bilangan Cara Membentuk Rentetan Sasaran Diberi Kamus. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!