zoukankan      html  css  js  c++  java
  • LeetCode394 字符串解码

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

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





    /*
    解题思路:采用迭代+两个栈。
        用两个stack,一个用来保存个数,一个用来保存字符串,我们遍历输入字符串,如果遇到数字,我们更新计数变量cnt;如果遇到左中括号,我们把当前cnt压入数字栈中,把当前t压入字符串栈中;如果遇到右中括号时,我们取出数字栈中顶元素,存入变量k,然后给字符串栈顶元素循环加上k个t字符串,然后取出栈顶元素存入字符串t中;如果遇到字母,我们直接加入字符串t中即可。
    s = "3[a2[c]]", 返回 "accaccacc".
    */
    
    class Solution {
    public:
        string decodeString(string s) {
            string t="";  //保存当前字符串,假设初始为空
            int cnt=0;  //假设初始为0
            stack<int>sNum; //数字栈,保存重复次数
            stack<string>sStr;  //字符串栈,保存字符串
            for(int i=0;i<s.size();++i){
                if(s[i]>='0'&&s[i]<='9'){  //遇到数字
                    cnt=10 * cnt + s[i]-'0';  //想想这里为什么要+ 10 * cnt  可能重复次数大于等于10
                }
                else if(s[i]=='['){  //遇到左括号
                    sNum.push(cnt);
                    sStr.push(t);
                    cnt=0;
                    t.clear();  //想想为什么这里要清空
                }
                else if(s[i]==']'){  //遇到右括号
                    int k=sNum.top();
                    sNum.pop();
                    for(int j=0;j<k;++j){
                        sStr.top() += t;
                    }
                    t=sStr.top();
                    sStr.pop();
                }
                else{  //遇到字母
                    t += s[i];
                }
            }
            return sStr.empty()?t:sStr.top();
        }
    };
  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/parzulpan/p/10061631.html
Copyright © 2011-2022 走看看