【每日一题】字符串解码

在这里插入图片描述

题目描述


394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = “3[a]2[bc]”
输出:“aaabcbc”
示例 2:

输入:s = “3[a2[c]]”
输出:“accaccacc”
示例 3:

输入:s = “2[abc]3[cd]ef”
输出:“abcabccdcdcdef”
示例 4:

输入:s = “abc3[cd]xyz”
输出:“abccdcdcdxyz”

提示:

1 <= s.length <= 30
s 由小写英文字母、数字和方括号 ‘[]’ 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300]

题解


递归

需要注意,由于int& x,x是需要不断往后走的,而不同的栈帧用到同一个变量,可以使用static,成员变量,传引用的方式。

  • 遇到左括号就递归下一层
  • 每一个栈帧维护一个temp子串,当遇到]将结果返回给上一层
  • 遇到正常字符就入,num需要提前保存,表示该字符串出现的次数。
  • 最后返回第一层栈帧的时候,就可以获得最终的结果,并且返回。
class Solution {
public:
    string dfs(const string s, int& x)
    {
        string temp;
        for (x; x < s.size(); ++x)
        {
            if (s[x] >= '0' && s[x] <= '9')
            {
                int num = s[x] - '0';
                while (x + 1 < s.size() && s[x + 1] >= '0' && s[x + 1] <= '9')
                {
                    num = num * 10 + s[x + 1] - '0';
                    ++x;
                }
                ++x;//[
                ++x;//字符
                string str = dfs(s, x);

                for (int i = 0; i < num; ++i)
                {
                    temp += str;
                }
            }
            else if (s[x] == ']')
            {
                return temp;
            }
            else
            {
                temp += s[x];
            }
        }
        return temp;
    }
    string decodeString(string s) {
        int x = 0;
        return dfs(s, x);
    }
};

利用栈

四种情况分析:

  • 为整数,就更新整数
  • [就将先前的res保存,数字保存
  • ]将保存的结果拿出进行计算。栈保存的是之前的结果,res维护的是当前的结果。
  • 为正常字符,维护res。
class Solution {
public:
    stack<int> numst;
    stack<string> strst;
    string decodeString(string s) {
        int num = 0;
        string res;
        for(int i = 0;i < s.size() ;++i)
        {
            if(s[i] >= '0' && s[i] <= '9')
            {
                num = num * 10 + s[i] - '0';
            }
            else if(s[i] == '[')
            {
                numst.push(num);
                num = 0;
                strst.push(res);
                res = "";
            }
            else if(s[i] ==']')
            {
                int times = numst.top();numst.pop();
                for(int i = 0;i < times; ++ i)
                {
                    strst.top() += res; 
                }
                res = strst.top();
                strst.pop();
            }
            else
            {
                res += s[i];
            }
        }

        return res;
    }
};



end

  • 喜欢就收藏
  • 认同就点赞
  • 支持就关注
  • 疑问就评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

^jhao^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值