目錄
範例
方法2
演算法
輸出
示例
输出
首頁 後端開發 C++ 遞歸解碼一個以計數後跟子字串編碼的字串

遞歸解碼一個以計數後跟子字串編碼的字串

Sep 09, 2023 pm 01:53 PM
編碼 遞迴 解碼

遞歸解碼一個以計數後跟子字串編碼的字串

在這個問題中,我們需要透過重複新增總計數次數來解碼給定的字串。

我們可以採用三種不同的方法來解決問題,並且可以使用兩個堆疊或一個堆疊來解決問題。另外,我們可以在不使用兩個堆疊的情況下解決問題。

問題陳述 - 我們給了一個字串 str ,其中包含左括號和右括號、字母和數字字元。我們需要遞歸地解碼字串。

以下是解碼字串的模式或規則。

  • [chars] - “chars”應該在結果字串中出現 count 次。

範例

輸入

str = "2[d]3[c2[n]]";
登入後複製

輸出

ddcnncnncnn
登入後複製

說明

  • 首先,我們解碼 2[n],得到「2[d]3[cnn]」。

  • 接下來,我們解碼 3[cnn]。所以,我們得到「2[d]cnnncnncnn」。

  • 接下來,我們解碼 2[d]。所以,我們得到“ddcnnncnncnn”。

輸入

5[i]
登入後複製

輸出

iiiii
登入後複製

解釋- 當我們解碼給定的字串時,我們得到 5 個「I」。

輸入

3[fg]
登入後複製

輸出

fgfgfg
登入後複製

解釋- 當我們解碼輸入字串時,我們得到「fg」3次。

方法 1

我們將使用兩個堆疊來解決此方法中的問題。當我們得到一個左括號時,我們將其推入堆疊。此外,當我們獲取數字字元時,我們將所有數字字元附加到有效的正整數並將它們添加到整數堆疊中。之後,當我們得到右括號時,我們從堆疊中彈出整數和字元。

演算法

第 1 步- 定義「instSt」堆疊來儲存數字,定義「strSt」來儲存字串字元和左括號。此外,初始化“answer”以儲存結果字串,初始化“tempStr”以儲存臨時字串。

第 2 步- 開始遍歷字串。

第 3 步- 如果目前字元是數字,則用 0 初始化「num」以儲存數字。

步驟 3.1 − 如果第 pth 索引處的字元是數字,則遍歷字串,直到得到字母字元或括號。在循環中,將“num”的先前值乘以 10,並將當前數字加到其中。

步驟 3.2− 將「p」的值增加 1。

步驟 3.3 - 將數字值推送到「instSt」堆疊。

步驟 4 - 如果第 p 個索引處的字元是右括號,請依照下列步驟操作。

步驟 4.1- 用空字串初始化「temp_str」。之後,如果‘instSt’不為空,則從堆疊中彈出頂部整數。

步驟 4.2 - 現在,使用循環,直到我們得到左括號或堆疊從「strSt」堆疊變空。另外,將字元附加到“temp_str”。

步驟 4.3 - 如果我們因為「[」而停止對角色進行大便,請將其刪除。

步驟 4.4 - 接下來,我們需要在「answer」字串中附加「temp_Str」「num」次。

步驟 4.5 - 將「answer」字串的每個字元插入「strSt」堆疊中,並使用空字串重新初始化它。

步驟 5 − 如果目前字元是左括號,請依照下列步驟操作。

步驟 5.1 − 如果前一個字元是數字,則將「[」推入堆疊「StrSt」。否則,將「[」壓入 StrSt 堆疊,並將 1 壓入「instSt」堆疊。

第 6 步− 如果我們得到一個字母字符,則將其推入「strSt」堆疊。

第 7 步- 最後,使用循環從「strSt」堆疊中刪除所有字符,附加到「answer」字串,然後返回它。

範例

#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;
}
登入後複製

輸出

The resultant string after decoding it is - ddcnncnncnn
登入後複製

時間複雜度− O(n^2),因為我們遍歷字串並不斷向堆疊推送和彈出元素。

空間複雜度− 在堆疊中儲存元素的 O(n)。

方法2

我們將在這種方法中不使用堆疊來解決問題。另外,我們將使用reverse()方法來反轉字串。

演算法

第 1 步- 開始迭代字串。

第 2 步− 如果第 i 個字元是“]”,則將其推入“answer”字串。否則,請按照以下步驟操作。

第 3 步- 使用空字串初始化「temp_Str」。

第 4 步- 繼續遍歷「answer」字串,直到該字串為空或找到「[」字元。另外,繼續從“answer”字串中彈出最後一個字元並將其附加到“temp_Str”字串中。

第 5 步- 當我們從找到「]」括號的位置向後遍歷時,反轉「temp_Str」字串。

第 6 步- 從「answer」字串中刪除最後一個字元以刪除「[」字元。

第 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;
}
登入後複製

输出

The resultant string after decoding it is − ddcnncnncnn
登入後複製

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

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

以上是遞歸解碼一個以計數後跟子字串編碼的字串的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C++ 函式的遞歸實作:遞迴深度有限制嗎? C++ 函式的遞歸實作:遞迴深度有限制嗎? Apr 23, 2024 am 09:30 AM

C++函數的遞歸深度受到限制,超過此限制會導致堆疊溢位錯誤。限制值因係統和編譯器而異,通常在1000到10000之間。解決方法包括:1.尾遞歸最佳化;2.尾呼叫;3.迭代實作。

C++ lambda 表達式是否支援遞迴? C++ lambda 表達式是否支援遞迴? Apr 17, 2024 pm 09:06 PM

是的,C++Lambda表達式可以透過使用std::function支援遞歸:使用std::function捕捉Lambda表達式的參考。透過捕獲的引用,Lambda表達式可以遞歸呼叫自身。

C++ 函式的遞迴實作:遞迴與非遞迴演算法的比較分析? C++ 函式的遞迴實作:遞迴與非遞迴演算法的比較分析? Apr 22, 2024 pm 03:18 PM

遞歸演算法透過函數自呼叫解決結構化的問題,優點是簡潔易懂,缺點是效率較低且可能發生堆疊溢位;非遞歸演算法透過明確管理堆疊資料結構避免遞歸,優點是效率更高且避免堆疊溢出,缺點是程式碼可能更複雜。選擇遞歸或非遞歸取決於問題和實現的特定限制。

在Java中遞歸地計算子字串出現的次數 在Java中遞歸地計算子字串出現的次數 Sep 17, 2023 pm 07:49 PM

給定兩個字串str_1和str_2。目標是使用遞歸過程計算字串str1中子字串str2的出現次數。遞歸函數是在其定義中呼叫自身的函數。如果str1是"Iknowthatyouknowthatiknow",str2是"know"出現次數為-3讓我們透過範例來理解。例如輸入str1="TPisTPareTPamTP",str2="TP";輸出Countofoccurrencesofasubstringrecursi

知識圖譜:大模型的理想搭檔 知識圖譜:大模型的理想搭檔 Jan 29, 2024 am 09:21 AM

大型語言模式(LLM)具有產生流暢和連貫文字的能力,為人工智慧的對話、創意寫作等領域帶來了新的前景。然而,LLM也存在一些關鍵限制。首先,它們的知識僅限於從訓​​練資料中辨識出的模式,缺乏對世界的真正理解。其次,推理能力有限,不能進行邏輯推理或從多個資料來源融合事實。面對更複雜、更開放的問題時,LLM的回答可能變得荒謬或矛盾,被稱為「幻覺」。因此,儘管LLM在某些方面非常有用,但在處理複雜問題和真實世界情境時,仍存在一定的限制。為了彌補這些差距,近年來出現了檢索增強生成(RAG)系統,其核心思想是

常見的幾種編碼方式 常見的幾種編碼方式 Oct 24, 2023 am 10:09 AM

常見的編碼方式有ASCII編碼、Unicode編碼、UTF-8編碼、UTF-16編碼、GBK編碼等。詳細介紹:1、ASCII編碼是最早的字符編碼標準,使用7位二進制數表示128個字符,包括英文字母、數字、標點符號以及控製字符等;2、Unicode編碼是一種用於表示世界上所有字元的標準編碼方式,它為每個字元分配了一個唯一的數字碼點;3、UTF-8編碼等等。

C++ 函式遞歸詳解:遞迴在字串處理中的應用 C++ 函式遞歸詳解:遞迴在字串處理中的應用 Apr 30, 2024 am 10:30 AM

遞歸函數是一種在字串處理中反覆呼叫自身來解決問題的技術。它需要一個終止條件以防止無限遞歸。遞歸在字串反轉和回文檢查等操作中被廣泛使用。

如何在C語言程式設計中實作中文字元的編碼和解碼? 如何在C語言程式設計中實作中文字元的編碼和解碼? Feb 19, 2024 pm 02:15 PM

在現代電腦程式設計中,C語言是一種非常常用的程式語言之一。儘管C語言本身並不直接支援中文編碼和解碼,但我們可以使用一些技術和函式庫來實現這項功能。本文將介紹如何在C語言程式設計軟體中實作中文編碼和解碼。首先,要實作中文編碼和解碼,我們需要了解中文編碼的基本概念。目前,最常用的中文編碼方案是Unicode編碼。 Unicode編碼為每個字元分配了一個唯一的數字值,以便在計

See all articles