394.字符串解码

Posted thefatcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
};

 

以上是关于394.字符串解码的主要内容,如果未能解决你的问题,请参考以下文章

java 394.解码字符串(#dfs).java

leetcode 394.字符串解码 Java

leetcode 394 字符串解码.

Leetcode394.字符串解码

Leetcode394.字符串解码

leecode 394. 字符串解码 java版本