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

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

题目:

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

思路:

本题直接去处理很难处理,我们可以调用数据结构栈来维护出答案。我们定义一个\(pair<int, string>\)类型的栈,当我们遇到数字我们先把它们存到一个空的\(vector\)里面,然后遇到非数字和括号字符,把字符存到一个字符串\(res\)里面。当我们遇到前括号''\([\)'',我们就把\(vector\)里面的数字字符转化为数字\(num\),再把\(num\)\(res\)进行\(make pair\)一下存到栈里面。当遇到“\(]\)”,我们弹出栈顶元素,并把\(res\)更新为\(it.first * res + 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 @ 2022-01-03 00:18  合肥学院王星力  阅读(110)  评论(0)    收藏  举报