搜尋
首頁後端開發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中文網其他相關文章!

陳述
本文轉載於:tutorialspoint。如有侵權,請聯絡admin@php.cn刪除
11个常见的分类特征的编码技术11个常见的分类特征的编码技术Apr 12, 2023 pm 12:16 PM

机器学习算法只接受数值输入,所以如果我们遇到分类特征的时候都会对分类特征进行编码,本文总结了常见的11个分类变量编码方法。1、ONE HOT ENCODING最流行且常用的编码方法是One Hot Enoding。一个具有n个观测值和d个不同值的单一变量被转换成具有n个观测值的d个二元变量,每个二元变量使用一位(0,1)进行标识。例如:编码后最简单的实现是使用pandas的' get_dummiesnew_df=pd.get_dummies(columns=[‘Sex’], data=df)2、

utf8编码汉字占多少字节utf8编码汉字占多少字节Feb 21, 2023 am 11:40 AM

utf8编码汉字占3个字节。在UTF-8编码中,一个中文等于三个字节,一个中文标点占三个字节;而在Unicode编码中,一个中文(含繁体)等于两个字节。UTF-8使用1~4字节为每个字符编码,一个US-ASCIl字符只需1字节编码,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码。

知识图谱:大模型的理想搭档知识图谱:大模型的理想搭档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编码等等。

PHP编码小技巧:如何生成带有防伪验证功能的二维码?PHP编码小技巧:如何生成带有防伪验证功能的二维码?Aug 17, 2023 pm 02:42 PM

PHP编码小技巧:如何生成带有防伪验证功能的二维码?随着电子商务和互联网的发展,二维码越来越被广泛应用于各行各业。而在使用二维码的过程中,为了确保产品的安全性和防止伪造,为二维码添加防伪验证功能是十分重要的一环。本文将介绍如何使用PHP生成带有防伪验证功能的二维码,并附上相应代码示例。在开始之前,我们需要准备以下几个必要的工具和库:PHPQRCode:PHP

如何解决php数据库查询结果编码的问题如何解决php数据库查询结果编码的问题Mar 21, 2023 am 11:49 AM

PHP是一种流行的Web编程语言,可以用于编写动态网页和应用程序。在实际应用中,PHP经常需要与数据库进行交互,进行数据的查询和处理。然而,在使用PHP从数据库中获取结果时,可能会遇到编码的问题,这通常会导致出现乱码。那么,如何解决php数据库查询结果编码的问题呢?

hdb3编码规则是啥hdb3编码规则是啥Aug 29, 2023 pm 01:38 PM

编码规则是:1、如果前一个编码是0,当前数据位为0,则编码为0;2、如果前一个编码是0,当前数据位为1,则编码为双极脉冲(+A或-A),并将计数器加1;3、如果前一个编码是1,当前数据位为1,则编码为0,并将计数器加1;4、如果前一个编码是1,当前数据位为0,则根据计数器的奇偶性来确定编码方式,如果是偶数,则编码为(+B或-B),如果是奇数,则编码为零电平,并将计数器清零等等。

一文搞懂如何基于 GenAI 提升编码效能一文搞懂如何基于 GenAI 提升编码效能Apr 01, 2024 pm 06:49 PM

Hellofolks,我是Luga,今天我们来聊一下人工智能(AI)生态领域相关的技术-GenAI。面对日新月异的技术创新以及差异化的业务场景挑战,传统的编码方式已经开始出现水土不服,难以完全应对日益增长的诉求。与此同时,新兴的通用GenAI(人工智能技术)具有极具潜力的能力来满足这一需求。GenAI作为人工智能技术的代表,以其强大的潜力和能力已经开始在各行各业得到广泛应用。它可以自动学习和适应不同场景下的编码需求,极大地提高了编码效率和质量。通过深度学习和模型优化,GenAI能够准确地理解不同

See all articles

熱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.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器