力扣394. 字符串解码 Decode String

核心在于规则:

1、通过str和num来搜集记录遇到的字母和数字

2、遇到 '[' 字母str,数字num分别入栈,并重置(入栈了后信息保留,重置供后面的使用)

3、遇到 ']' 出栈两次,取出栈内的str 和num 并与目前的str组合,结果为 栈内str+num*目前的str

详细过程可以看笔记图。

class Solution {
public:
    string getnum(string s)
    {   string res;
        for(int i=0;i<s.size();i++)
        {
            if(!isdigit(s[i]))
            {
               
                res= s.substr(0,i);
                 break;
            }
        }
        
        return res;
    }
    string decodeString(string s) {
        string str="";
        string num="";
        int size =s.size();
        stack<string>stk;
        for(int i=0;i<s.size();i++)
        {    
            
            char crr = s[i];
            
            if(isdigit(crr))
            { //搜集数字  
                string t =s.substr(i,size-i+1);
                num = getnum(t);
                i+=num.size()-1;
            }
            else if(isalpha(crr))
            { //搜集字母
                str+=crr;
            }else if(crr=='[')
            { //遇左括号两次入栈
                stk.push(str);
                stk.push(num);
                str="";
                num="";
            }
            else if(crr ==']')
            {// 遇右括号两次出栈
                string _num;
                string _str;
                _num = stk.top();
                stk.pop();
                _str = stk.top();
                stk.pop();
                int times = stoi(_num);
                for(int k=0;k<times;k++)
                {
                    _str +=str; //旧的组合上新的
                }
                str =_str;
                cout<<str<<endl;
            }

        }
        return str;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值