Leetcode C++《热题 Hot 100-63》394. 字符串解码

Leetcode C++《热题 Hot 100-63》394. 字符串解码

1. 题目

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

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

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

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

示例:

s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 思路

  • 使用栈,方案:遇到], 就去temp找[, 并把这中间的string拼接起来,然后找到k值,把这个string复制k倍,push进去;如果是左括号,直接push进去;如果是字符串,则将字符串进行拼接
  • 时间复杂度 n*n

3. 代码

class Solution {
public:
    vector<int> numsV;
    string decodeString(string s) {
        if (s.length() == 0)
            return "";
        stack<string> temp;
        stack<int> nums;
       vector<string> seperateStr = seperateString(s);
       int index = 0;
        for (int i = 0; i < seperateStr.size(); i++) {
            //3[a2[c]]
            //3  [ a  2 [ c 
            // 3 [ a  cc
            //accaccacc
            if (seperateStr[i] == "[") {
                temp.push(seperateStr[i]);
                //cout << "push: " << seperateStr[i] << endl;
                nums.push(numsV[index]);
                index++;
            }  
            else if (seperateStr[i] == "]"){
                stack<string> subReverseTempStack;
                while(!temp.empty() && temp.top() != "[") {
                    subReverseTempStack.push(temp.top());
                    //cout << "pop: " << temp.top() << endl;
                    temp.pop();
                }
                //cout << "pop: " << temp.top() << endl;
                temp.pop();
                int k = nums.top();
                nums.pop();
                string subTemp1="";
                string subReverseTemp="";
                while(!subReverseTempStack.empty()) {
                    subReverseTemp += subReverseTempStack.top();
                    subReverseTempStack.pop();
                }
                for (int j = 0; j < k; j++)
                    subTemp1+=subReverseTemp;
                //cout << "push: " << subTemp1 << endl;
                temp.push(subTemp1);
            } else {
                // ab cd ef
                //ef cd ab

                stack<string> subReverseTempStack;
                subReverseTempStack.push(seperateStr[i]);
                while(!temp.empty() && temp.top() != "[") {
                    subReverseTempStack.push(temp.top());
                    //cout << "pop: " << temp.top() << endl;
                    temp.pop();
                }


                string subTemp="";
                while(!subReverseTempStack.empty()) {
                    subTemp += subReverseTempStack.top();
                    subReverseTempStack.pop();
                }
                temp.push(subTemp);
                //cout << "push: " << subTemp << endl;
            }
         }
         string res= "";
         stack<string> res_stack;
         while (!temp.empty()) {
             res_stack.push(temp.top());
             temp.pop();
         }
         while (!res_stack.empty()) {
             res += res_stack.top();
             res_stack.pop();
         }
         return res;
    }
    vector<string> seperateString(string s) {
        vector<string> seperateStr;
        int i = 0;
        for (i = 0; i < s.length(); i++) {
            if (s[i] == '[' || s[i] == ']')
                seperateStr.push_back(s.substr(i,1));
            else if (s[i] >= '0' && s[i] <= '9') {
                int startNumIndex = i;
                while (s[i] >= '0' && s[i] <= '9') {
                    i++;
                }
                numsV.push_back(stoi(s.substr(startNumIndex,i-startNumIndex),0,10));
                
                i--;
            } else {
                int startStrIndex = i;
                while (i < s.length()) {
                    if (s[i] >= '0' && s[i] <= '9')
                        break;
                    if (s[i] == '[' || s[i] == ']')
                        break;
                    i++;
                }
                seperateStr.push_back(s.substr(startStrIndex,i-startStrIndex));
                i--;
            }
        }
        /*for (int i = 0; i <seperateStr.size(); i++)
            cout << seperateStr[i] << " ";
        cout << endl;*/
        return seperateStr;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值