LeetCode 字符串解码(栈辅助)

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

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

思路分析:一开始吧,可能我们都会认为这是一道递归解法题,蛋试递归在这道题实现貌似有点困难,因为这里面的嵌套虽说比较一般,蛋试对于这种输入"3[a2[c]3[d]]","2[abc]3[cd]ef"比较难以处理,因为在是否和上一次的结果合并这个问题上比较难以判断。这时就要知道栈的应用了。

建立一个num栈,一个string栈,从前往后扫描字符串:
	如果是数字,读入到num栈
	如果是左括号,且后面是字符,读入字符串到string栈
	如果是右括号。将string栈顶元素重复num栈顶元素次,放回到string栈
	否则读入一个字符段,放入string栈
最后string栈顶就是结果
class Solution {
public:
    string decodeString(string s) {
        string result = "";
        stack<int> numStack;
        stack<string> strStack;
        strStack.push("");//防止输入的s串为空,所以初始化为“”
        int nowIndex = 0, sSize = (int)s.size();
        while (nowIndex < sSize){
            if (s[nowIndex] >= '0' && s[nowIndex] <= '9'){
                //读入一个数字到num栈
                string tempNum = "";
                while (s[nowIndex] >= '0' && s[nowIndex] <= '9'){
                    tempNum += s[nowIndex++];
                }
                numStack.push(stoi(tempNum));
            }
            else if (s[nowIndex] == ']'){
                string tempRes = "";
                //获取string栈顶
                string topStr = strStack.top();
                strStack.pop();
                //获取num栈顶
                int topNum = numStack.top();
                numStack.pop();
                //进行重复
                while (topNum-- > 0){
                    tempRes = topStr + tempRes;
                }
                //如果string栈此时非空,则需要将刚刚得到的结果合并现在的string栈顶
                if (!strStack.empty()){
                    tempRes = strStack.top() + tempRes;
                    strStack.pop();
                }
                //最后放回到string栈中
                strStack.push(tempRes);
                nowIndex += 1;
            }
            else if (s[nowIndex] == '['){
                //遇到左括号,需要读入一个字符段,蛋试也有可能后面是一个数字,所以只能读入一个字符段
                nowIndex += 1;
                string tempStr = "";
                while (nowIndex < sSize && !(s[nowIndex] >= '0' && s[nowIndex] <= '9') && s[nowIndex] != '[' && s[nowIndex] != ']'){
                    tempStr += s[nowIndex++];
                }
                strStack.push(tempStr);
            }
            else{
                //剩下的就是一个字符段的情况,形如"2[abc]3[cd]ef"中的“ef”
                string tempStr = "";
                //读出字符段
                while (nowIndex < sSize && !(s[nowIndex] >= '0' && s[nowIndex] <= '9') && s[nowIndex] != '[' && s[nowIndex] != ']'){
                    tempStr += s[nowIndex++];
                }
                //需要与string栈顶合并
                if (!strStack.empty()){
                    tempStr = strStack.top() + tempStr;
                    strStack.pop();
                }
                strStack.push(tempStr);
            }
        }
        return strStack.top();
    }
};

LeetCode 字符串解码(栈辅助)_第1张图片

你可能感兴趣的:(LeetCode)