LeetCode 394. 字符串解码

辅助栈

  1. s[i]为字母,res+=s[i]
  2. s[i]为数字,cnt = cnt*10 + s[i]-‘0’;
  3. s[i]为’[',入栈(res,cnt),随后将其置为空
    • res入栈,代表需要解码字符串之前的字符串,防止丢失
    • cnt入栈,代表接下来需要解码的字符串的次数
    • res置为空,代表获取接下来需要解码的字符串
    • cnt置为空,代表可能出出现嵌套式的解码字符串
  4. s[i]为’]',出栈(str, cnt)
    • res = str + res*cnt
class Solution {
public:
    string decodeString(string s) {
        string res = "";
        int cnt = 0;
        stack<pair<int,string>> encoded_stack;

        int len = s.size();

        for(auto c : s)
        {
            if(c == '[') // 入栈
            {
                encoded_stack.emplace(cnt, res);
                cnt = 0;
                res = "";
            }
            else if(c == ']') // 出栈,进行解码
            {
                pair<int, string> p = encoded_stack.top();
                encoded_stack.pop();
                cnt = p.first - 1;
				// 需要解码的字符串及其次数
                string tmp = res;
                while(cnt)
                {
                    res += tmp;
                    cnt--;
                }
                res = p.second + res; // 拼接到到源字符串
            }
            else if(c>='0' && c<='9')
                cnt = cnt * 10 + c - '0'; 
            else
                res += c;
        }

        return res;
    }
};

递归

  1. 以’['作为递归的开始
  2. 以‘]'作为递归的结束
class Solution {
public:
    string dfs(string& s, int& index)
    {
        string res = "";
        int cnt = 0;

        while(index < s.size())
        {
            if(s[index]>='0' && s[index]<='9')
                cnt = cnt*10 + s[index]-'0';
            else if(s[index] == '[')
            {
                index++;
                string str = dfs(s, index);
                while(cnt)
                {
                    res += str;
                    cnt--;
                }
            }
            else if(s[index] == ']')
                return res;
            else
                res += s[index];
            index++;
        }
        return res;
    }
    string decodeString(string s) {
        int index = 0;

        return dfs(s,index);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值