美文网首页
394字符串解码

394字符串解码

作者: su945 | 来源:发表于2020-06-25 09:39 被阅读0次

    题目描述

    给定一个经过编码的字符串,返回它解码后的字符串。

    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

    你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

    此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

    示例 1:
    输入:s = "3[a]2[bc]"
    输出:"aaabcbc"

    问题分析

    • 栈的性质利用
    • 读完题目,要我们类似于制作一个能使用分配律的计算器。想象:如3[a2[c]b] 使用一次分配律-> 3[accb] 再使用一次分配律->accbaccbaccb

    解题思路1

    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.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();
                    strs.pop();
                }
            }
    
            return res;
        }
    };
    

    解题思路2

    class Solution {
    public:
        //获取数字
        string getDigits(string &s, size_t &ptr) {
            string ret = "";
            while (isdigit(s[ptr])) {
                ret.push_back(s[ptr++]);
            }
            return ret;
        }
    
        string getString(vector <string> &v) {
            string ret;
            //字符串累加
            for (const auto &s : v) {
                ret += s;
            }
            return ret;
        }
    
        string decodeString(string s) {
            vector <string> stk;
            size_t ptr = 0;
    
            while (ptr < s.size()) {
                //当前字符
                char cur = s[ptr];
                if (isdigit(cur)) {
                    // 获取一个数字并进栈
                    string digits = getDigits(s, ptr);
                    stk.push_back(digits);
                }
                else if (isalpha(cur) || cur == '[') {
                    // 获取一个字母并进栈
                    stk.push_back(string(1, s[ptr++]));
                }
                else {
                    ++ptr;
                    vector <string> sub;
                    while (stk.back() != "[") {
                        //将字符串存入sub中
                        sub.push_back(stk.back());
                        //从stk中弹出
                        stk.pop_back();
                    }
                    //将字符串翻转
                    reverse(sub.begin(), sub.end());
                    // 左括号出栈
                    stk.pop_back();
                    // 此时栈顶为当前 sub 对应的字符串应该出现的次数
                    int repTime = stoi(stk.back());
                    stk.pop_back();
                    string t, o = getString(sub);
                    // 构造字符串
                    while (repTime--) t += o;
                    // 将构造好的字符串入栈
                    stk.push_back(t);
                }
            }
    
            return getString(stk);
        }
    };
    

    相关文章

      网友评论

          本文标题:394字符串解码

          本文链接:https://www.haomeiwen.com/subject/drtsfktx.html