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

王林
Lepaskan: 2023-09-09 13:53:06
ke hadapan
1137 orang telah melayarinya

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!

Label berkaitan:
sumber:tutorialspoint.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan