394.字符串解码

题目描述:

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

编码规则为: 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".

 

思想:借助栈来实现

以下用a2[b]举例子:

  • 当遇到'[',把'['和与之匹配的']'之间的字母需要重复的次数和'['之前的字符进栈,本例中进栈{2,a}
  • 当遇到']',代码中的字符串res即:b,就是要重复的字母,此时出栈之前进栈的{2,a},res变成a+2*b = abb
  • 部分注意事项看注释即可

代码:

class Solution {
public:
    typedef pair<int,string> pis;
    string repeat(const string &s, int times){
        string retString = "";
        for(int i=0;i<times;i++)
            retString += s;
        return retString;
    }
    string decodeString(string s) {
        vector<pis> vecStack;
        string res = "";
        int repeatTime = 0;
        for(auto i:s){
            if(i>='0' && i<='9'){
                repeatTime = repeatTime * 10 + (i - '0');
            }
            else if(i == '['){
                vecStack.push_back({repeatTime,res});   ////用vector代替stack,更高效,因为stack底层可以是vector
                res = "";  //进栈后要更新res和repeatTimes
                repeatTime = 0;
            }
            else if(i == ']'){
                pis tmp = vecStack[vecStack.size()-1];
                vecStack.pop_back();
                res = tmp.second + (tmp.first == 0?"":repeat(res,tmp.first));
            }
            else
                res += i;
        }
        return res;
    }
};

 

posted @ 2020-05-06 23:06  thefatcat  阅读(182)  评论(0编辑  收藏  举报