


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]]";
Output
ddcnncnncnn
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]
Output
iiiii
Penjelasan- Apabila kita menyahkod rentetan yang diberikan, kita mendapat 5 "I".
Masuk
3[fg]
Output
fgfgfg
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
#includeusing 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; }
Output
The resultant string after decoding it is - ddcnncnncnn
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 步- 返回“答案”字符串。
示例
#includeusing 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; }
输出
The resultant string after decoding it is − ddcnncnncnn
时间复杂度− 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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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;

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.

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";

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.

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

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.

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.

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
