LeetCode/字符串解码

给定一个经过编码的字符串,返回它解码后的字符串
输入:s = "3[a2[c]]"
输出:"accaccacc"

字符串栈和数字栈

对于这种具有优先级的操作,使用栈来进行匹配

class Solution {
public:
    string decodeString(string s) {
        string res = "";//当前层次串,遇到]后逐渐展开
        stack <int> nums;//数字栈
        stack <string> strs;//字符串栈
        int num = 0;//记录当前数
        int len = s.size();
        for(int i = 0; i < len; ++ i)//遍历所有字符,一个一个处理即可
        {
            if(s[i] >= '0' && s[i] <= '9')
                num = num * 10 + s[i] - '0';//读取数字
            
            else if((s[i] >= 'a' && s[i] <= 'z') ||(s[i] >= 'A' && s[i] <= 'Z'))
                res = res + s[i];//读取当前串

            else if(s[i] == '[') //将‘[’前的数字压入nums栈内, 字母字符串压入strs栈内
            {
                nums.push(num);//数字入栈
                num = 0;//清空
                strs.push(res); //串入栈作为上一层运算
                res = "";//当前层重置
            }
            else //遇到‘]’时,操作与之相配的‘[’之间的字符,使用分配律
            {
                int times = nums.top();//得到当前倍数
                nums.pop();//使用后清掉
                for(int j = 0; j < times; ++ j)
                    strs.top() += res;//复制当前串,这里直接拼接到上一个层串里,因为接下马上展开
                
                res = strs.top(); //之后若还是字母,就会直接加到res之后,因为它们是同一级的运算
                                  //若是左括号,res会被压入strs栈,作为上一层的运算

                strs.pop();//使用后清掉
            }
        }
        return res;
    }
};
posted @ 2022-07-07 15:36  失控D大白兔  阅读(86)  评论(0编辑  收藏  举报