解码C ++中的字符串

假设我们有一个编码字符串;我们必须返回其解码后的字符串。编码规则为:k [encoded_string],这表示方括号内的encode_string精确地重复了k次。我们可以假定原始数据不包含任何数字字符,并且数字仅用于那些重复的数字k。因此,如果输入像“ 1 [ba] 2 [na]”,那么输出将是“香蕉”。

为了解决这个问题,我们将遵循以下步骤-

  • 创建一个空堆栈,设置i:= 0

  • 而我<一个字符串的大小

    • res:=从堆栈中删除元素,仅使用方括号内的字符串。

    • n:= 0

    • 当堆栈不为空,并且堆栈顶部是一个数字字符时,则容纳数字并形成实际整数为n

    • 对于1到n范围内的j

    • 将res [x]插入堆栈

    • 对于x范围从0到res的大小

    • 如果s [i]是']'

    • 否则将s [i]插入堆栈

    • 使我增加1

    • ans:=一个空字符串

    • 当堆栈不为空时

      • 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"