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"

 具体实现过程看代码详细注释:

class Solution {
public:
    string decodeString(string s) {
        //定义两个stack,一个保存整数,一个保存字符串
        stack<int> nums;
        stack<string> strs;
        //string遍历记录临时字符串,并保存最终结果值
        string res;
        //num用来将记录将char转换为int,保存临时数值
        int num=0;
        //不用说len表示s的长度
        int len=s.length();
        //遍历s
        for(int i=0;i<len;i++){
            //遇到s中的数字进行处理
            if(s[i]>='0'&&s[i]<='9'){
            //转换成数字,因为可能存在23两个字符连在一起,因此需要记录int型的23
                num=num*10+s[i]-'0';
            }
            //如果遇到字符为26个字母,大小写的都算,此时str记录字符串,进行累加。
            else if(s[i]>='a'&&s[i]<='z' || s[i]>='A'&&s[i]<='Z'){
                res+=s[i];
            }
            //遇到[是,就需要将res之前保存的字符串压入string栈,将num压入int栈了。并将两者置为0和空串。
            else if(s[i]=='['){
                nums.push(num);
                num=0;
                strs.push(res);
                res="";
            }
            //遇到]时,此时就需要k倍的输出字符串了
            else{
                int times=nums.top();//去数字栈的栈顶元素,重复次数
                nums.pop();//取过之后,弹栈。
                for(int i=0;i<times;i++){
                //遇到]时,经需要将res目前保存的字符串,输出times次,因为res保存的是最终结果,因此经字符串的栈顶元素放到res之前,后面累加times次res保存的字符串,将最终的字符串,存到字符串栈顶,后续将栈顶字符串赋值给res进行保存。
                    strs.top()=strs.top()+res;
                }
                res = strs.top();//将字符串栈中的栈顶元素赋值给res
                strs.pop();//弹出字符串栈顶元素。

            }
        }
        return res;//返回res
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值