目次
- 「]」括弧が見つかった場所から逆方向に進み、「temp_Str」文字列を反転します。
示例
输出
ホームページ バックエンド開発 C++ カウントとそれに続く部分文字列としてエンコードされた文字列を再帰的にデコードします

カウントとそれに続く部分文字列としてエンコードされた文字列を再帰的にデコードします

Sep 09, 2023 pm 01:53 PM
コーディング 再帰 デコード

カウントとそれに続く部分文字列としてエンコードされた文字列を再帰的にデコードします

この問題では、合計カウント回数を繰り返し加算することで、指定された文字列をデコードする必要があります。

問題には 3 つの異なる方法でアプローチでき、問題を解決するために 2 つのスタックまたは 1 つのスタックを使用できます。また、スタックを 2 つ使用せずに問題を解決することもできます。

問題文 - 左括弧、右括弧、英字、数字を含む文字列 str が与えられています。文字列を再帰的にデコードする必要があります。

以下は、文字列をデコードするためのパターンまたはルールです。

  • [chars] - 「chars」は結果文字列に count 回出現する必要があります。

###例### ######入力###### リーリー ######出力###### リーリー

イラスト

まず、2[n] をデコードして、「2[d]3[cnn]」を取得します。

次に、3[cnn]をデコードします。したがって、「2[d]cnnncnncnn」が得られます。

    次に、2[d]をデコードします。したがって、「ddcnnnncnncnn」が得られます。
  • ######入力###### リーリー ######出力###### リーリー
  • 説明

    - 指定された文字列をデコードすると、5 つの「I」が得られます。

    ######入力###### リーリー ######出力###### リーリー
  • 説明

    - 入力文字列をデコードすると、「fg」が 3 回得られます。

  • 方法1

この方法では 2 つのスタックを使用して問題を解決します。開き括弧を取得したら、それをスタックにプッシュします。さらに、数値を取得すると、すべての数値を有効な正の整数に追加し、整数スタックに追加します。その後、閉じ括弧を取得したら、スタックから整数と文字をポップします。 ###アルゴリズム###

ステップ 1

- 数値を格納する「instSt」スタックと、文字列文字と左括弧を格納する「strSt」スタックを定義します。さらに、「answer」は結果文字列を格納するために初期化され、「tempStr」は一時文字列を格納するために初期化されます。

ステップ 2

- 文字列のトラバースを開始します。

ステップ 3

- 現在の文字が数字の場合は、「num」を 0 で初期化し、数字を保存します。

ステップ 3.1

- pthth インデックスの文字が数字の場合は、英字または括弧が見つかるまで文字列をたどります。ループ内で、「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」文字列に追加してそれを返します。

###例### リーリー ###出力### リーリー

時間計算量- O(n^2)。文字列を反復処理し、要素をスタックにプッシュおよびポップし続けるためです。

空間複雑度- スタックに要素を格納するには O(n)。

方法 2 この方法ではスタックを使わずに問題を解決します。さらに、 reverse() メソッドを使用して文字列を反転します。

###アルゴリズム###

ステップ 1- 文字列の反復を開始します。

ステップ 2- i 番目の文字が「]」の場合、それを「回答」文字列にプッシュします。それ以外の場合は、以下の手順に従ってください。

ステップ 3 - 「temp_Str」を空の文字列で初期化します。

ステップ 4 - 文字列が空になるか、「[」文字が見つかるまで、「answer」文字列の反復処理を続けます。また、「answer」文字列から最後の文字をポップし、それを「temp_Str」文字列に追加し続けます。

ステップ 5

- 「]」括弧が見つかった場所から逆方向に進み、「temp_Str」文字列を反転します。

ステップ 6 - 「回答」文字列から最後の文字を削除して、「[」文字を削除します。

第 7 步- 如果“答案”字符串顶部包含数字,则使用数字生成一个整数,并将其存储在 number 变量中。

第 8 步- 反转数字字符串。

第 9 步- 使用 stoi() 方法将字符串转换为数字。

步骤 10 - 将 temp_Str 字符串附加到答案字符串“number”次。

第 11 步- 返回“答案”字符串。

示例

#include <bits/stdc++.h>
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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++ 関数の再帰的実装: 再帰の深さに制限はありますか? C++ 関数の再帰的実装: 再帰の深さに制限はありますか? Apr 23, 2024 am 09:30 AM

C++ 関数の再帰の深さは制限されており、この制限を超えるとスタック オーバーフロー エラーが発生します。制限値はシステムやコンパイラによって異なりますが、通常は 1,000 ~ 10,000 の間です。解決策には次のものが含まれます: 1. 末尾再帰の最適化、2. 末尾呼び出し、3. 反復実装。

C++ ラムダ式は再帰をサポートしていますか? C++ ラムダ式は再帰をサポートしていますか? Apr 17, 2024 pm 09:06 PM

はい、C++ ラムダ式は std::function を使用して再帰をサポートできます。std::function を使用して Lambda 式への参照をキャプチャします。キャプチャされた参照を使用すると、ラムダ式はそれ自体を再帰的に呼び出すことができます。

C++ 関数の再帰的実装: 再帰的アルゴリズムと非再帰的アルゴリズムの比較分析? C++ 関数の再帰的実装: 再帰的アルゴリズムと非再帰的アルゴリズムの比較分析? Apr 22, 2024 pm 03:18 PM

再帰アルゴリズムは、関数の自己呼び出しを通じて構造化された問題を解決します。利点は、シンプルで理解しやすいことですが、欠点は、効率が低く、スタック オーバーフローを引き起こす可能性があることです。非再帰アルゴリズムは、明示的に管理することで再帰を回避します。スタック データ構造の利点は、より効率的でスタックのオーバーフローを回避できることですが、欠点はコードがより複雑になる可能性があることです。再帰的か非再帰的かの選択は、問題と実装の特定の制約によって異なります。

Java で部分文字列の出現数を再帰的にカウントする Java で部分文字列の出現数を再帰的にカウントする Sep 17, 2023 pm 07:49 PM

2 つの文字列 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 にはいくつかの重要な制限もあります。まず、彼らの知識はトレーニング データから認識されたパターンに限定されており、世界に対する真の理解が欠けています。第 2 に、推論スキルには限界があり、論理的な推論を行ったり、複数のデータ ソースからの事実を融合したりすることができません。より複雑で自由回答の質問に直面すると、LLM の答えは「幻想」として知られる不条理または矛盾したものになる場合があります。したがって、LLM はいくつかの面では非常に便利ですが、複雑な問題や現実世界の状況を扱う場合には、依然として一定の制限があります。これらのギャップを埋めるために、検索拡張生成 (RAG) システムが近年登場しました。

いくつかの一般的なエンコード方法 いくつかの一般的なエンコード方法 Oct 24, 2023 am 10:09 AM

一般的なエンコード方法には、ASCII エンコード、Unicode エンコード、UTF-8 エンコード、UTF-16 エンコード、GBK エンコードなどがあります。詳細な紹介: 1. ASCII エンコードは、英語の文字、数字、句読点、制御文字などを含む 128 文字を表すために 7 ビット 2 進数を使用する、最も初期の文字エンコード標準です; 2. Unicode エンコードは、文字を表すために使用される方法です。世界中のすべての文字 各文字に固有のデジタル コード ポイントを割り当てる文字の標準的なエンコード方式、3. UTF-8 エンコードなど。

C++関数の再帰の詳しい解説:文字列処理における再帰の応用 C++関数の再帰の詳しい解説:文字列処理における再帰の応用 Apr 30, 2024 am 10:30 AM

再帰関数は、文字列処理の問題を解決するためにそれ自体を繰り返し呼び出す手法です。無限再帰を防ぐために終了条件が必要です。再帰は、文字列の反転や回文チェックなどの操作で広く使用されています。

C言語プログラミングで漢字のエンコードとデコードを実装するにはどうすればよいですか? C言語プログラミングで漢字のエンコードとデコードを実装するにはどうすればよいですか? Feb 19, 2024 pm 02:15 PM

現代のコンピューター プログラミングにおいて、C 言語は最も一般的に使用されるプログラミング言語の 1 つです。 C 言語自体は中国語のエンコードとデコードを直接サポートしていませんが、いくつかのテクノロジとライブラリを使用してこの機能を実現できます。この記事では、C言語プログラミングソフトウェアで中国語のエンコードとデコードを実装する方法を紹介します。まず、中国語のエンコードとデコードを実装するには、中国語のエンコードの基本概念を理解する必要があります。現在、最も一般的に使用されている中国語のエンコード スキームは Unicode エンコードです。 Unicode エンコードでは、各文字に一意の数値が割り当てられるため、計算時に

See all articles