字节跳动每日一题打卡:leetcode 394. 字符串解码

字节跳动每日一题打卡:leetcode 394. 字符串解码

题目:

给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encodedstring],表示其中方括号内部的 encodedstring正好重复 k 次。注意k保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

思路:

本题直接去处理很难处理,我们可以调用数据结构栈来维护出答案。我们定义一个pair<int,string>类型的栈,当我们遇到数字我们先把它们存到一个空的vector里面,然后遇到非数字和括号字符,把字符存到一个字符串res里面。当我们遇到前括号''['',我们就把vector里面的数字字符转化为数字num,再把numres进行makepair一下存到栈里面。当遇到“]”,我们弹出栈顶元素,并把res更新为it.firstres+it.second,依次遍历,直至栈空。

代码:

class Solution {
public:
    string decodeString(string s) {
        stack<pair<int, string>>stk;
        int len = s.length();
        string res = "";
        string ans = "";
        vector<int>num;
        for(int i = 0; i < len; i ++ ){
            if(s[i] == '[')
            {
                int dig = 0;
                int cnt = 0;
                for(int i = num.size() - 1; i >= 0; i --)
                    dig += num[i] * pow(10, cnt ++);
                stk.push({dig,res});
                res = "";
                num.clear();
            }
            else if(s[i] >= 48 && s[i] <= 57)   num.push_back(s[i] - '0');
            else if(s[i] == ']')
            {
                auto it = stk.top();
                stk.pop();
                string res1 = "";
                res1 += it.second;
                
                for(int i = 1; i <= it.first; i ++ ) 
                    res1 += res;
                res = res1;
                if(stk.empty()){
                    ans = ans + res;
                    res = "";
                }
            }
            else res += s[i];
        }
    return ans + res;
    }
    
};
posted @   bigstrength  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示

目录导航