Jadual Kandungan
Kaedah 2
Algoritma
Contoh
Output
Example
示例
输出
Rumah pembangunan bahagian belakang C++ Kira bilangan cara untuk membelah rentetan kepada subrentetan K bermula dengan nombor genap dan mempunyai panjang minimum M

Kira bilangan cara untuk membelah rentetan kepada subrentetan K bermula dengan nombor genap dan mempunyai panjang minimum M

Sep 09, 2023 pm 02:01 PM
Pemisahan rentetan Bilangan kaedah Mulakan dengan nombor genap

Kira bilangan cara untuk membelah rentetan kepada subrentetan K bermula dengan nombor genap dan mempunyai panjang minimum M

Dalam masalah ini, kita akan mengira cara untuk membahagikan rentetan yang diberikan kepada substring K supaya ia memenuhi syarat yang diberikan dalam pernyataan masalah.

Kami akan menggunakan rekursi untuk menyelesaikan masalah ini. Selain itu, kami akan menggunakan kaedah pengaturcaraan dinamik jadual untuk menyelesaikan masalah ini dengan cekap.

Pernyataan Masalah − Kami mempunyai rentetan panjang tertentu yang dipanggil bin_Str. Rentetan mengandungi hanya aksara angka dari '0' hingga '9'. Kita perlu mengira bilangan cara untuk membahagikan rentetan kepada subrentetan K supaya ia memenuhi syarat berikut.

  • Subrentetan hendaklah mengandungi sekurang-kurangnya 2 aksara.

  • Watak pertama setiap subrentetan hendaklah genap dan aksara terakhir hendaklah ganjil.

Contoh Contoh

Masuk

M = 2, K = 2; bin_str = "255687"
Salin selepas log masuk

Output

1
Salin selepas log masuk

Penjelasan − Berdasarkan syarat penyataan masalah, kita boleh membahagikan 255 | 687 kepada bahagian rentetan yang diberikan.

Masuk

M = 2, K = 2; bin_str = "26862";
Salin selepas log masuk

Output

0
Salin selepas log masuk

Penjelasan − Memandangkan rentetan mengandungi nombor genap sahaja, kita tidak boleh membahagikannya kepada dua subrentetan supaya setiap subrentetan berakhir dengan nombor ganjil.

Masuk

M = 2, K = 3; bin_str = "856549867";
Salin selepas log masuk

Output

3
Salin selepas log masuk

Penjelasan − Kaedah pembahagian yang mungkin ialah 85|65|49867, 8565|49|867 dan 85|6549|867.

Kaedah 1

Kami akan menggunakan fungsi rekursif untuk menyelesaikan masalah ini. Jika kami menemui subrentetan yang sah pada indeks semasa, kami membuat panggilan rekursif mengira bilangan cara untuk memisahkan subrentetan yang tinggal kepada subrentetan K - 1.

Algoritma

Langkah 1 − Dapatkan aksara pertama dan terakhir rentetan yang diberikan.

Langkah 2 − Jika aksara pertama tidak genap dan aksara terakhir tidak ganjil, kembalikan 0.

Langkah 3 − Jika indeks permulaan sama dengan panjang rentetan, kembalikan 0 kerana kita telah sampai ke penghujung rentetan yang diberikan.

Langkah 4− Jika K == 1, ambil perbezaan antara panjang rentetan dan indeks permulaan. Jika ia sama dengan atau lebih besar daripada M, maka 1 dikembalikan. Jika tidak, mengembalikan 0. Di sini, jika K ialah 1, kita perlu mendapatkan subrentetan yang tinggal.

Langkah 5 - Mulakan 'ops' kepada '0' untuk menyimpan kiraan belahan, dan 'len' kepada '0' untuk menyimpan panjang subrentetan semasa.

Langkah 6 − Lintas rentetan bermula dari indeks "mula" sehingga penghujung rentetan.

Langkah 7− Tingkatkan ‘len’ sebanyak 1. Pada masa yang sama, dapatkan watak semasa dan watak seterusnya.

Langkah 8− Jika 'len' lebih besar daripada M, dan nombor semasa adalah ganjil dan nombor seterusnya adalah genap, kita boleh menamatkan partition pada indeks semasa. Jadi, buat panggilan rekursif ke fungsi countWays() dengan menghantar indeks seterusnya dan K - 1 sebagai parameter fungsi.

Langkah 9− Akhir sekali, kembalikan nilai ‘ops’.

Contoh

#include <bits/stdc++.h>
using namespace std;

int countWays(int start, int str_len, int K, int M, string bin_str) {
    // Geeting first and last character of the substring
    int f_char = bin_str[0] - '0';
    int l_char = bin_str[str_len - 1] - '0';
    if (f_char % 2 != 0 || l_char % 2 != 1) {
        return 0;
    }
    // When we reach at the end
    if (start == str_len)
        return 0;
    // Base case
    if (K == 1) {
        int chars = str_len - start;
        // Validate minimum length of substring
        if (chars >= M)
            return 1;
        return 0;
    }    
    int ops = 0;
    int len = 0;
    // Traverse all partions
    for (int p = start; p < str_len - 1; p++) {
        len++;
        int first = bin_str[p] - '0';
        int second = bin_str[p + 1] - '0';
        // If we can end the partition at p and start a new partition at p+1
        if (len >= M && first % 2 == 1) {
            if (second % 2 == 0) {
                ops += countWays(p + 1, str_len, K - 1, M, bin_str);
            }
        }
    }
    return ops;
}
int main() {
    int M = 2, K = 2;
    string bin_str = "255687";
    int str_len = bin_str.length();
    cout << "The number of ways to split the string is " << countWays(0, str_len, K, M, bin_str) << endl;
    return 0;
}
Salin selepas log masuk

Output

The number of ways to split the string is 1
Salin selepas log masuk
Salin selepas log masuk

Bilangan cara untuk membelah rentetan ialah 1

Kerumitan ruang - O(1) kerana kami tidak menggunakan ruang tambahan.

Kaedah 2

Dalam kaedah ini, kami akan menggunakan teknik pengaturcaraan dinamik jadual untuk mengira bilangan cara untuk membelah rentetan kepada bahagian K. Kami akan menggunakan matriks untuk menyimpan output keadaan sebelumnya.

Algoritma

Langkah 1 - Tentukan tatasusunan matriks matriks global[] bersaiz 1001 x 1001. Baris peta matriks kepada aksara rentetan, dan lajur peta matriks kepada K.

Langkah 2 − Dapatkan aksara pertama dan terakhir rentetan. Jika aksara pertama genap dan aksara terakhir ganjil, fungsi countWays() dilaksanakan. Jika tidak, cetak 0 dalam output.

Langkah 3 − Dalam fungsi countWays, mulakan tatasusunan matriks[].

Langkah 4 − Bilangan baris matriks yang dilalui adalah sama dengan panjang rentetan, dan bilangan lajur adalah sama dengan K. Jika bilangan baris sama dengan panjang rentetan, kemas kini keseluruhan baris kepada 0.

Langkah 5 − Jika tidak, jika q ialah 1 dan panjang rentetan tolak indeks semasa lebih besar daripada M, mulakan matriks tatasusunan[p][q] dengan 1. Jika tidak, mulakan matriks[p][q] dengan 0.

Langkah 6 − Dalam kes lain, mulakan matriks [p][q] kepada -1.

Langkah 7− Isikan matriks menggunakan dua gelung bersarang. Gunakan gelung luar untuk melintasi dari 2 ke K, dan gunakan gelung bersarang untuk melintasi dari 0 ke panjang rentetan.

Langkah 8 - Mulakan 'ops' dan 'len' kepada 0. Selain itu, lelaran pada rentetan bermula pada indeks p-th dan tambah 'len' sebanyak 1 pada setiap lelaran.

Langkah 9 − Keluarkan watak semasa dan watak seterusnya rentetan.

Langkah 10− Jika panjang lebih besar daripada M, aksara semasa adalah ganjil, dan aksara seterusnya adalah genap, tambahkan matriks[k + 1][q − 1] pada 'ops'.

Langkah 11− Gunakan 'ops' untuk mengemas kini matriks [p][q].

Langkah 12− Akhirnya kembalikan matriks[0][k].

Example

的中文翻译为:

示例

#include <bits/stdc++.h>
using namespace std;

int matrix[1001][1001];
int countWays(int str_len, int K, int M, string bin_str) {
    // Base case
    for (int p = 0; p <= str_len; p++) {
        for (int q = 0; q <= K; q++) {
            // When index points to end index of string
            if (p == str_len)
                matrix[p][q] = 0;
            else if (q == 1) {
                // When only 1 split needs to be done
                int chars = str_len - p;
                // Validating substring's minimum len
                if (chars >= M)
                    matrix[p][q] = 1;
                else
                    matrix[p][q] = 0;
            } else {
                // For other cases
                matrix[p][q] = -1;
            }
        }
    }
    // Dynamic programming approach
    for (int q = 2; q <= K; q++) {
        for (int p = 0; p < str_len; p++) {
            int ops = 0;
            int len = 0; // length of current substring
            for (int k = p; k < str_len - 1; k++) {
                len++;
                int first = bin_str[k] - '0';
                int second = bin_str[k + 1] - '0';
                // Validate condition for split
                if (len >= M && first % 2 == 1 && second % 2 == 0) {
                    // Substring starting from k + 1 index needs to be splited in q-1 parts
                    ops += matrix[k + 1][q - 1];
                }
            }
            matrix[p][q] = ops;
        }
    }
    return matrix[0][K];
}
int main() {
    int M = 2, K = 2;
    string bin_str = "255687";
    int str_len = bin_str.length();
    int f_char = bin_str[0] - '0';
    int l_char = bin_str[str_len - 1] - '0';
    cout << "The number of ways to split the string is ";
    if (f_char % 2 != 0 || l_char % 2 != 1) {
        cout << 0 << endl;
    } else {
        cout << countWays(str_len, K, M, bin_str) << endl;
    }
    return 0;
}
Salin selepas log masuk

输出

The number of ways to split the string is 1
Salin selepas log masuk
Salin selepas log masuk

时间复杂度 - O(N*N*K),其中 O(N*N) 用于找到所有子字符串,O(K) 用于 K 个分区。

空间复杂度 - 使用matrix[]数组为O(N*K)。

Atas ialah kandungan terperinci Kira bilangan cara untuk membelah rentetan kepada subrentetan K bermula dengan nombor genap dan mempunyai panjang minimum M. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan fungsi split() dalam Python 3.x untuk membelah rentetan mengikut pembatas yang ditentukan Cara menggunakan fungsi split() dalam Python 3.x untuk membelah rentetan mengikut pembatas yang ditentukan Jul 31, 2023 pm 08:33 PM

Python ialah bahasa pengaturcaraan popular yang menyediakan banyak fungsi terbina dalam untuk mengendalikan rentetan. Salah satu fungsi yang biasa digunakan ialah fungsi split(), yang boleh memisahkan rentetan kepada berbilang subrentetan mengikut pembatas yang ditentukan. Artikel ini akan memperkenalkan cara menggunakan fungsi split() dalam Python3.x. Dalam Python, fungsi split() ialah fungsi terbina dalam kelas rentetan Sintaks asasnya adalah seperti berikut: string.split(separator,maxsplit)

Panjang pisah maksimum rentetan supaya setiap aksara dalam rentetan muncul dalam subrentetan Panjang pisah maksimum rentetan supaya setiap aksara dalam rentetan muncul dalam subrentetan Aug 25, 2023 pm 02:41 PM

Dalam artikel ini, kami akan meneroka masalah bagaimana untuk mencari panjang partition memaksimumkan rentetan dengan aksara unik. Kami mula-mula memahami penyataan masalah dan kemudian mengkaji kaedah naif dan cekap untuk menyelesaikan masalah ini, termasuk algoritma dan kerumitan masa masing-masing. Akhirnya, kami akan melaksanakan penyelesaian dalam C++. Pernyataan Masalah Diberi rentetan, bahagikan rentetan itu kepada seberapa banyak subrentetan yang mungkin supaya setiap aksara dalam rentetan muncul dalam satu subrentetan sahaja. Mengembalikan panjang pemisahan memaksimumkan ini. Pendekatan naif Pendekatan naif adalah untuk mengulang melalui rentetan, merekodkan kejadian terakhir setiap aksara. Kemudian, ulangi rentetan sekali lagi dan buat partition apabila kejadian terakhir aksara semasa ditemui. Algoritma (naif) untuk memulakan tatasusunan untuk menyimpan rentetan

Bagaimana untuk memisahkan rentetan kepada tatasusunan dalam PHP Bagaimana untuk memisahkan rentetan kepada tatasusunan dalam PHP Jul 08, 2023 pm 01:49 PM

Cara Membahagikan Rentetan kepada Array dalam PHP Dalam PHP, kita selalunya perlu memproses rentetan dan membahagikannya kepada beberapa bahagian. Memisahkan rentetan kepada tatasusunan ialah operasi biasa yang membantu kami mengendalikan pelbagai bahagian rentetan dengan lebih baik. Dalam artikel ini, kita akan belajar cara membahagikan rentetan kepada tatasusunan menggunakan fungsi dalam PHP dan menyediakan beberapa contoh kod. Gunakan fungsi explode untuk memisahkan rentetan kepada tatasusunan PHP menyediakan fungsi yang dipanggil explode, yang boleh memisahkan rentetan mengikut pembatas yang ditentukan.

Cara menggunakan fungsi explode untuk memisahkan rentetan dalam PHP Cara menggunakan fungsi explode untuk memisahkan rentetan dalam PHP Jun 26, 2023 pm 12:03 PM

Dalam bahasa PHP, terdapat banyak fungsi asas yang boleh membantu kami memproses rentetan dengan cepat dan cekap. Antaranya, fungsi letupan adalah fungsi pemisahan rentetan yang sangat praktikal. Ia boleh memisahkan rentetan kepada tatasusunan mengikut pembatas yang ditentukan, dan kemudian melakukan operasi rentetan yang lebih fleksibel. Dalam artikel ini, kami akan memperkenalkan cara menggunakan fungsi explode untuk memisahkan rentetan dalam PHP. 1. Format fungsi explode Format fungsi explode dalam bahasa PHP adalah seperti berikut: explode(separa

Kira bilangan cara untuk membelah rentetan kepada subrentetan K bermula dengan nombor genap dan mempunyai panjang minimum M Kira bilangan cara untuk membelah rentetan kepada subrentetan K bermula dengan nombor genap dan mempunyai panjang minimum M Sep 09, 2023 pm 02:01 PM

Dalam masalah ini, kita akan mengira cara untuk membahagikan rentetan yang diberikan kepada substring K supaya ia memenuhi syarat yang diberikan dalam pernyataan masalah. Kami akan menggunakan rekursi untuk menyelesaikan masalah ini. Selain itu, kami akan menggunakan kaedah pengaturcaraan dinamik jadual untuk menyelesaikan masalah ini dengan cekap. Pernyataan Masalah − Kami mempunyai rentetan panjang tertentu yang dipanggil bin_Str. Rentetan mengandungi hanya aksara angka dari '0' hingga '9'. Kita perlu mengira bilangan cara untuk membahagikan rentetan kepada subrentetan K supaya ia memenuhi syarat berikut. Subrentetan hendaklah mengandungi sekurang-kurangnya 2 aksara. Aksara pertama setiap subrentetan hendaklah genap dan aksara terakhir hendaklah ganjil. ContohContoh inputM=2,K=2;bin_str="255687&q

Bagaimana untuk menyelesaikan ralat yang dilaporkan oleh fungsi letupan dalam PHP Bagaimana untuk menyelesaikan ralat yang dilaporkan oleh fungsi letupan dalam PHP Mar 11, 2024 am 11:45 AM

Kaedah untuk menyelesaikan ralat yang dilaporkan oleh fungsi explode dalam PHP memerlukan contoh kod tertentu Dalam PHP, fungsi explode ialah fungsi yang digunakan untuk memisahkan rentetan kepada tatasusunan mengikut pembatas yang ditentukan. Walau bagaimanapun, kadangkala ralat berlaku apabila menggunakan fungsi letupan, terutamanya kerana parameter yang diluluskan tidak memenuhi keperluan fungsi tersebut. Di bawah ini kami akan membincangkan kemungkinan masalah dan penyelesaian secara terperinci, dan memberikan contoh kod khusus. Ralat disebabkan oleh bilangan parameter yang salah apabila menggunakan fungsi letupan

Contoh fungsi rentetan PHP: pemisahan rentetan Contoh fungsi rentetan PHP: pemisahan rentetan Jun 20, 2023 pm 01:58 PM

Terdapat banyak fungsi rentetan dalam PHP, antaranya fungsi pemisahan rentetan sangat biasa digunakan. Fungsi pemisahan rentetan boleh membelah rentetan mengikut pembatas yang ditentukan dan mengembalikan tatasusunan. Di bawah ini kami akan memperkenalkan beberapa fungsi pemisahan rentetan yang biasa digunakan. fungsi explode Fungsi explode boleh memisahkan rentetan mengikut pembatas yang ditentukan dan mengembalikan tatasusunan. Sintaksnya adalah seperti berikut: explode(string$separator,string$string

Menyemak sama ada rentetan boleh dipecahkan kepada tiga subrentetan, di mana satu subrentetan ialah subrentetan daripada dua subrentetan yang lain Menyemak sama ada rentetan boleh dipecahkan kepada tiga subrentetan, di mana satu subrentetan ialah subrentetan daripada dua subrentetan yang lain Sep 22, 2023 am 11:53 AM

Dalam masalah ini, kita perlu membahagikan rentetan yang diberikan supaya subrentetan ketiga boleh menjadi subrentetan daripada dua subrentetan pertama. Mari kita fikirkan penyelesaiannya. Rentetan ketiga boleh menjadi subrentetan daripada dua rentetan pertama hanya jika dua rentetan pertama mengandungi semua aksara rentetan ketiga. Jadi, kita perlu mencari sekurang-kurangnya satu aksara dengan kekerapan lebih daripada 3 dalam rentetan yang diberikan, dan kita boleh mengambil subrentetan ketiga bagi aksara tunggal itu. Pernyataan Masalah - Kami diberi rentetan str yang mengandungi N aksara abjad huruf kecil. Kita perlu menyemak sama ada kita boleh membahagikan rentetan kepada tiga subrentetan a, b dan c supaya subrentetan c ialah subrentetan a dan b. Bergantung pada sama ada 3 subrentetan boleh ditemui, cetak "ya" atau "tidak"

See all articles