[栈][字符串]leetcode394:字符串解码

题目:
[栈][字符串]leetcode394:字符串解码_第1张图片
解题思路:
遍历字符串,如果遇到的是数,则把数存入num;如果遇到的是左括号,那么将num压入数栈,将左括号前面的字符串ans压入字符串栈,然后将num清0,将ans也清空;如果遇到的是右括号,那么将数栈的栈顶数弹出记为 k,然后将当前的ans重复k次,连接到字符串栈的栈顶字符串后面,然后将字符串栈的栈顶字符串弹出,保存为ans;如果遇到的是字母,则将ans连接上该字母。当字符串遍历结束后,返回结果ans。

代码如下:

class Solution {
public:
    string decodeString(string s) {
        string ans = "";
        stack<int> snum;    //记录'['之前的数字
        stack<string> sstr; //记录'['之前的字符串运算结果
        int num = 0;
        for(int i = 0; i < s.size(); i++){
            //记录多位数
            while(s[i] >= '0' && s[i] <= '9'){
                num =  num * 10 +(s[i] - '0');
                i++;
            }
            // 遇到 '[' 时,将之前的字符和数字都压栈,并将其设为初值
            if(s[i] == '['){
                snum.push(num);
                sstr.push(ans);
                num = 0;
                ans = "";
            }
            //遇到']'时,将两个栈的栈顶元素弹出,在栈顶字符串后连接k个当前的ans,弹出字符串栈顶元素并更新ans
            else if(s[i] == ']'){
                int k = snum.top();//重复k次
                snum.pop();
                for(int i = 0; i < k; i++){
                    sstr.top() += ans;
               }
                ans = sstr.top();//更新ans
                sstr.pop();//字符栈栈顶元素出栈
            }
            //将字符添加到ans
            else{
                ans += s[i];
            }
        }
        return ans;
    }
};

你可能感兴趣的:(leetcode刷题)