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.
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.
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.
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.
#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; }
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.
Kami akan menyelesaikan masalah tanpa menggunakan stack dalam kaedah ini. Selain itu, kami akan menggunakan kaedah reverse() untuk membalikkan rentetan.
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!