C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で文字列をデコードする


エンコードされた文字列があるとします。デコードされた文字列を返す必要があります。エンコードの規則は次のとおりです。k[encoded_string]、これは角括弧内のencoded_stringが正確にk回繰り返されている場所を示します。元のデータには数字が含まれておらず、数字はそれらの繰り返し番号kのみであると想定できます。したがって、入力が「1 [ba] 2 [na]」の場合、出力は「バナナ」になります。

これを解決するには、次の手順に従います-

  • 空のスタックを1つ作成し、i:=0に設定します
  • whilei<文字列のサイズ
    • s[i]が‘]’の場合
      • res:=スタックから要素を削除し、角かっこ内にある文字列のみを取得します。
      • n:=0
      • スタックが空ではなく、スタックトップが1つの数字である場合、数値に対応し、実際の整数をnとして形成します
      • 1からnの範囲のjの場合
        • 0からresのサイズまでの範囲のxの場合
          • res[x]をスタックに挿入します
    • それ以外の場合は、s[i]をスタックに挿入します
    • iを1増やします
  • ans:=空の文字列
  • スタックが空でない間
    • ans:=スタックトップ要素+ ans
    • スタックからポップ
  • 回答を返す

例(C ++):

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   string decodeString(string s) {
      stack <char> st;
      int i = 0;
      while(i<s.size()){
         if(s[i] == ']'){
            string res = "";
            while(st.top()!='['){
               res = st.top() + res;
               st.pop();
            }
            st.pop();
            int n = 0;
            int x = 1;
            while(!st.empty() && st.top()>='0' && st.top()<='9'){
               n = n + (st.top()-'0')*x;
               x*=10;
               st.pop();
            }
            for(int j = 1; j <= n; j++){
               for(int x = 0; x < res.size();x++){
                  st.push(res[x]);
               }
            }
         }
         else{
            st.push(s[i]);
         }
         i++;
      }
      string ans ="";
      while(!st.empty()){
         ans = st.top() + ans;
         st.pop();
      }
      return ans;
   }
};
main(){
   Solution ob;
   cout << ob.decodeString("1[ba]2[na]");
}

入力

"1[ba]2[na]"

出力

"banana"

  1. C++での文字列のトークン化

    このセクションでは、C++で文字列をトークン化する方法を説明します。 Cでは、文字配列にstrtok()関数を使用できます。ここに文字列クラスがあります。次に、その文字列から区切り文字を使用して文字列を切り取る方法を説明します。 C ++機能を使用するには、文字列を文字列ストリームに変換する必要があります。次に、getline()関数を使用して、タスクを実行できます。 getline()関数は、文字列ストリーム、出力を送信するための別の文字列、およびストリームのスキャンを停止するための区切り文字を受け取ります。 関数がどのように機能しているかを理解するために、次の例を見てみましょう。 サン

  2. C ++で文字列をトークン化しますか?

    最初の方法は、文字列ストリームを使用して、スペースで区切られた単語を読み取ることです。これは少し制限されていますが、適切なチェックを提供すれば、タスクはかなりうまくいきます。 例 #include <vector> #include <string> #include <sstream> using namespace std; int main() {    string str("Hello from the dark side");    string tmp; // A string