Jadual Kandungan
Contoh
Kaedah 2
Algoritma
Output
示例
输出
Rumah pembangunan bahagian belakang C++ Menyahkod rekursif rentetan yang dikodkan sebagai kiraan diikuti dengan subrentetan

Menyahkod rekursif rentetan yang dikodkan sebagai kiraan diikuti dengan subrentetan

Sep 09, 2023 pm 01:53 PM
pengekodan rekursi penyahkodan

Menyahkod rekursif rentetan yang dikodkan sebagai kiraan diikuti dengan subrentetan

Dalam masalah ini kita perlu menyahkod rentetan yang diberikan dengan menambah jumlah bilangan bilangan kali berulang kali.

Kita boleh mendekati masalah dalam tiga cara berbeza dan boleh menggunakan dua tindanan atau satu tindanan untuk menyelesaikan masalah. Selain itu, kita boleh menyelesaikan masalah tanpa menggunakan dua tindanan.

Pernyataan Masalah - Kami diberi rentetan str yang mengandungi kurungan kiri dan kanan, aksara alfa dan angka. Kita perlu menyahkod rentetan secara rekursif.

Berikut ialah corak atau peraturan untuk menyahkod rentetan.

  • [chars] - "chars" sepatutnya muncul kiraan kali dalam rentetan yang terhasil.

Contoh

Masuk

str = "2[d]3[c2[n]]";
Salin selepas log masuk

Output

ddcnncnncnn
Salin selepas log masuk

Arahan

  • Mula-mula, kami menyahkod 2[n] dan mendapatkan "2[d]3[cnn]".

  • Seterusnya, kami menyahkod 3[cnn]. Jadi, kita mendapat "2[d]cnnncnncnn".

  • Seterusnya, kami menyahkod 2[d]. Jadi, kita mendapat "ddcnnncnncnn".

Masuk

5[i]
Salin selepas log masuk

Output

iiiii
Salin selepas log masuk

Penjelasan- Apabila kita menyahkod rentetan yang diberikan, kita mendapat 5 "I".

Masuk

3[fg]
Salin selepas log masuk

Output

fgfgfg
Salin selepas log masuk

Penjelasan- Apabila kita menyahkod rentetan input, kita mendapat "fg" 3 kali.

Kaedah 1

Kami akan menggunakan dua tindanan untuk menyelesaikan masalah dalam kaedah ini. Apabila kami mendapat kurungan pembukaan, kami menolaknya ke tindanan. Selain itu, apabila kami mendapat aksara angka, kami menambahkan semua aksara angka pada integer positif yang sah dan menambahkannya pada tindanan integer. Selepas itu, apabila kami mendapat kurungan penutup, kami mengeluarkan integer dan aksara daripada timbunan.

Algoritma

Langkah 1- Tentukan tindanan "instSt" untuk menyimpan nombor dan "strSt" untuk menyimpan aksara rentetan dan kurungan kiri. Selain itu, "jawapan" dimulakan untuk menyimpan rentetan hasil dan "tempStr" dimulakan untuk menyimpan rentetan sementara.

Langkah 2- Mula melintasi rentetan.

Langkah 3- Jika aksara semasa ialah nombor, mulakan "num" dengan 0 untuk menyimpan nombor.

Langkah 3.1 − Jika aksara pada indeks pth ialah nombor, kemudian lelaran melalui rentetan sehingga anda mendapat aksara abjad atau kurungan. Dalam gelung, darabkan nilai "num" sebelumnya dengan 10 dan tambahkan nombor semasa padanya.

Langkah 3.2− Naikkan nilai “p” sebanyak 1.

Langkah 3.3 - Tolak nilai berangka ke tindanan "instSt".

Langkah 4 - Jika aksara pada indeks pth ialah kurungan kanan, ikut langkah ini.

Langkah 4.1- Mulakan "temp_str" dengan rentetan kosong. Selepas itu, jika 'instSt' tidak kosong, keluarkan integer teratas daripada timbunan.

Langkah 4.2 - Sekarang, gunakan gelung sehingga kita mendapat kurungan kiri atau tindanan menjadi kosong daripada tindanan "strSt". Selain itu, tambahkan aksara pada "temp_str".

Langkah 4.3 - Jika kita berhenti membuang najis kerana "[", keluarkannya.

Langkah 4.4 - Seterusnya, kita perlu menambahkan masa "temp_Str" "num" pada rentetan "jawapan".

Langkah 4.5 - Masukkan setiap aksara rentetan "jawapan" ke dalam tindanan "strSt" dan mulakan semula dengan rentetan kosong.

Langkah 5 − Jika watak semasa ialah kurungan kiri, sila ikuti langkah di bawah.

Langkah 5.1 − Jika aksara sebelumnya ialah nombor, tolak "[" pada tindanan "StrSt". Jika tidak, tolak '[' pada tindanan StrSt dan tolak 1 pada tindanan 'instSt'.

Langkah 6− Jika kita mendapat aksara abjad, tolaknya ke timbunan "strSt".

Langkah 7- Akhir sekali, gunakan gelung untuk mengalih keluar semua aksara daripada tindanan "strSt", tambahkan pada rentetan "jawapan", dan kembalikannya.

Contoh

#include 
using namespace std;

string decodeTheString(string alpha) {
    stack instSt;
    stack StrSt;
    string tempStr = "", answer = "";
    // Iterate the string
    for (int p = 0; p < alpha.length(); p++) {
        int num = 0;
        // If we find the number, extract the number and push it to the stack
        if (alpha[p] >= '0' && alpha[p] <= '9') {
            // Making iterations until we get an alphabetic character
            while (alpha[p] >= '0' && alpha[p] <= '9') {
                num = num * 10 + alpha[p] - '0';
                p++;
            }
            p--;
            instSt.push(num);
        }
        // If the character at the pth index is closing bracket
        else if (alpha[p] == ']') {
            tempStr = "";
            num = 0;
            // Pop the number from the stack
            if (!instSt.empty()) {
                num = instSt.top();
                instSt.pop();
            }
            // Pop the character until we get the opening bracket
            while (!StrSt.empty() && StrSt.top() != '[') {
                tempStr = StrSt.top() + tempStr;
                StrSt.pop();
            }
            // remove the opening bracket
            if (!StrSt.empty() && StrSt.top() == '[')
                StrSt.pop();
            // Append string to answer for num times
            for (int j = 0; j < num; j++)
                answer = answer + tempStr;
            // Insert the updated string again into the stack
            for (int j = 0; j < answer.length(); j++)
                StrSt.push(answer[j]);
            answer = "";
        }
        // If the character at the pth index is an opening bracket
        else if (alpha[p] == '[') {
            if (alpha[p - 1] >= '0' && alpha[p - 1] <= '9') {
                StrSt.push(alpha[p]);
            } else {
                StrSt.push(alpha[p]);
                instSt.push(1);
            }
        } else {
            // Push alphabetic character in the string stack.
            StrSt.push(alpha[p]);
        }
    }
    // Pop all the elements, make a string, and return.
    while (!StrSt.empty()) {
        answer = StrSt.top() + answer;
        StrSt.pop();
    }
    return answer;
}
// starting code
int main() {
    string str = "2[d]3[c2[n]]";
    cout << "The resultant string after decoding it is - " << decodeTheString(str) << endl;
    return 0;
}
Salin selepas log masuk

Output

The resultant string after decoding it is - ddcnncnncnn
Salin selepas log masuk

Kerumitan masa− O(n^2) kerana kami mengulangi rentetan dan terus menolak dan melonjakkan elemen ke timbunan.

Kerumitan Ruang− O(n) untuk menyimpan elemen dalam tindanan.

Kaedah 2

Kami akan menyelesaikan masalah tanpa menggunakan stack dalam kaedah ini. Selain itu, kami akan menggunakan kaedah reverse() untuk membalikkan rentetan.

Algoritma

Langkah 1- Mula mengulang rentetan.

Langkah 2− Jika aksara ke-i ialah "]", tolaknya ke dalam rentetan "jawapan". Jika tidak, ikuti langkah di bawah.

Langkah 3- Mulakan "temp_Str" dengan rentetan kosong.

Langkah 4- Teruskan lelaran melalui rentetan "jawapan" sehingga rentetan itu kosong atau aksara "[" ditemui. Juga, teruskan memunculkan aksara terakhir daripada rentetan "jawapan" dan tambahkannya pada rentetan "temp_Str".

Langkah 5- Balikkan rentetan "temp_Str" semasa kita melintasi ke belakang dari tempat kita menemui kurungan "]".

Langkah 6- Keluarkan aksara terakhir daripada rentetan "jawapan" untuk mengalih keluar aksara "[".

第 7 步- 如果“答案”字符串顶部包含数字,则使用数字生成一个整数,并将其存储在 number 变量中。

第 8 步- 反转数字字符串。

第 9 步- 使用 stoi() 方法将字符串转换为数字。

步骤 10 - 将 temp_Str 字符串附加到答案字符串“number”次。

第 11 步- 返回“答案”字符串。

示例

#include 
using namespace std;

string decodeTheString(string alpha) {
    string answer = "";
    // iterate the string characters
    for (int i = 0; i < alpha.length(); i++) {
        // for all other characters except the closing bracket
        if (alpha[i] != ']') {
            answer.push_back(alpha[i]);
        } else {
            // Extract the substring lying within the pair
            string temp_str = "";
            // Keep on popping characters until '[' is found.
            while (!answer.empty() && answer.back() != '[') {
                temp_str.push_back(answer.back());
                answer.pop_back();
            }
            // get original string by reversing the string
            reverse(temp_str.begin(), temp_str.end());
            // open bracket removal
            answer.pop_back();
            // get integer value before the '[' character
            string number = "";
            // get the number before opening bracket
            while (!answer.empty() && answer.back() >= '0' && answer.back() <= '9') {
                number.push_back(answer.back());
                answer.pop_back();
            }
            // reverse number string
            reverse(number.begin(), number.end());
            // convert string to integer
            int numInt = stoi(number);
            for (int p = 0; p < numInt; p++) {
                answer += temp_str;
            }
        }
    }
    return answer;
}
int main() {
    string str = "2[d]3[c2[n]]";
    cout << "The resultant string after decoding it is - " << decodeTheString(str) << endl;
    return 0;
}
Salin selepas log masuk

输出

The resultant string after decoding it is − ddcnncnncnn
Salin selepas log masuk

时间复杂度− O(N^2),因为我们遍历字符串并在循环内使用reverse()方法。

空间复杂度− O(N) 来存储数字和临时字符串。

Atas ialah kandungan terperinci Menyahkod rekursif rentetan yang dikodkan sebagai kiraan diikuti dengan subrentetan. 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)

Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Apr 23, 2024 am 09:30 AM

Kedalaman rekursi fungsi C++ adalah terhad, dan melebihi had ini akan mengakibatkan ralat limpahan tindanan. Nilai had berbeza antara sistem dan penyusun, tetapi biasanya antara 1,000 dan 10,000. Penyelesaian termasuk: 1. Pengoptimuman rekursi ekor; 2. Panggilan ekor;

Adakah ungkapan lambda C++ menyokong rekursi? Adakah ungkapan lambda C++ menyokong rekursi? Apr 17, 2024 pm 09:06 PM

Ya, ungkapan Lambda C++ boleh menyokong rekursi dengan menggunakan std::function: Gunakan std::function untuk menangkap rujukan kepada ungkapan Lambda. Dengan rujukan yang ditangkap, ungkapan Lambda boleh memanggil dirinya secara rekursif.

Kira bilangan kejadian subrentetan secara rekursif dalam Java Kira bilangan kejadian subrentetan secara rekursif dalam Java Sep 17, 2023 pm 07:49 PM

Diberi dua rentetan str_1 dan str_2. Matlamatnya adalah untuk mengira bilangan kejadian subrentetan str2 dalam rentetan str1 menggunakan prosedur rekursif. Fungsi rekursif ialah fungsi yang memanggil dirinya dalam definisinya. Jika str1 ialah "Iknowthatyouknowthatiknow" dan str2 ialah "tahu" bilangan kejadian ialah -3 Mari kita fahami melalui contoh. Contohnya, input str1="TPisTPareTPamTP", str2="TP";

Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Apr 22, 2024 pm 03:18 PM

Algoritma rekursif menyelesaikan masalah berstruktur melalui fungsi panggilan kendiri Kelebihannya ialah ia mudah dan mudah difahami, tetapi kelemahannya ialah ia kurang cekap dan boleh menyebabkan limpahan timbunan Algoritma bukan rekursif mengelakkan pengulangan dengan menguruskan secara eksplisit struktur data timbunan Kelebihannya ialah ia lebih cekap dan mengelakkan limpahan, kelemahannya ialah kod itu mungkin lebih kompleks. Pilihan rekursif atau bukan rekursif bergantung kepada masalah dan kekangan khusus pelaksanaan.

Graf pengetahuan: rakan kongsi yang ideal untuk model besar Graf pengetahuan: rakan kongsi yang ideal untuk model besar Jan 29, 2024 am 09:21 AM

Model bahasa besar (LLM) mempunyai keupayaan untuk menghasilkan teks yang lancar dan koheren, membawa prospek baharu ke bidang seperti perbualan kecerdasan buatan dan penulisan kreatif. Walau bagaimanapun, LLM juga mempunyai beberapa had utama. Pertama, pengetahuan mereka terhad kepada corak yang diiktiraf daripada data latihan, kurang pemahaman sebenar tentang dunia. Kedua, kemahiran menaakul adalah terhad dan tidak boleh membuat inferens logik atau menggabungkan fakta daripada pelbagai sumber data. Apabila berhadapan dengan soalan yang lebih kompleks dan terbuka, jawapan LLM mungkin menjadi tidak masuk akal atau bercanggah, dikenali sebagai "ilusi." Oleh itu, walaupun LLM sangat berguna dalam beberapa aspek, ia masih mempunyai had tertentu apabila berhadapan dengan masalah kompleks dan situasi dunia sebenar. Untuk merapatkan jurang ini, sistem penjanaan dipertingkatkan semula (RAG) telah muncul dalam beberapa tahun kebelakangan ini

Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Apr 30, 2024 am 10:30 AM

Fungsi rekursif ialah teknik yang memanggil dirinya berulang kali untuk menyelesaikan masalah dalam pemprosesan rentetan. Ia memerlukan syarat penamatan untuk mengelakkan rekursi tak terhingga. Rekursi digunakan secara meluas dalam operasi seperti pembalikan rentetan dan pemeriksaan palindrom.

Beberapa kaedah pengekodan biasa Beberapa kaedah pengekodan biasa Oct 24, 2023 am 10:09 AM

Kaedah pengekodan biasa termasuk pengekodan ASCII, pengekodan Unikod, pengekodan UTF-8, pengekodan UTF-16, pengekodan GBK, dsb. Pengenalan terperinci: 1. Pengekodan ASCII ialah standard pengekodan aksara yang paling awal, menggunakan nombor perduaan 7-bit untuk mewakili 128 aksara, termasuk huruf Inggeris, nombor, tanda baca, aksara kawalan, dsb. 2. Pengekodan Unikod ialah kaedah yang digunakan untuk mewakili semua aksara di dunia Kaedah pengekodan standard aksara, yang memberikan titik kod digital yang unik kepada setiap aksara 3. Pengekodan UTF-8, dsb.

Bagaimana untuk melaksanakan pengekodan dan penyahkodan aksara Cina dalam pengaturcaraan bahasa C? Bagaimana untuk melaksanakan pengekodan dan penyahkodan aksara Cina dalam pengaturcaraan bahasa C? Feb 19, 2024 pm 02:15 PM

Dalam pengaturcaraan komputer moden, bahasa C adalah salah satu bahasa pengaturcaraan yang paling biasa digunakan. Walaupun bahasa C itu sendiri tidak menyokong pengekodan dan penyahkodan Cina secara langsung, kami boleh menggunakan beberapa teknologi dan perpustakaan untuk mencapai fungsi ini. Artikel ini akan memperkenalkan cara melaksanakan pengekodan dan penyahkodan bahasa Cina dalam perisian pengaturcaraan bahasa C. Pertama, untuk melaksanakan pengekodan dan penyahkodan Cina, kita perlu memahami konsep asas pengekodan Cina. Pada masa ini, skim pengekodan Cina yang paling biasa digunakan ialah pengekodan Unicode. Pengekodan Unikod memberikan nilai angka yang unik kepada setiap aksara supaya apabila mengira

See all articles