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".

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

    解析思路:借助两个辅助栈,一个是数字栈,一个是字符串栈

    难点在于:括号内嵌套括号时,需要由内向外生成拼接字符串,与栈的特性符合

    算法流程

    1.构建辅助栈 numStack和stk,分别存储数字和字符串,对于字符串的每一个字符c

      (1)c为数字时,将数字转化成multi,用于后续的倍数计算

      (2)c为字母时,在tmpStr后添加c

      (3)当c为‘[’时,将multi和tmpStr分别入栈,并分别重置为0和“”

        记录'['之前的临时结果到stk中,用于后续的对应']'的拼接操作

        记录“[”之前的倍数入栈,用于发现对应的‘]’后,获取multi*()的字符串

        进入新的“["后,res和multi重新开始记录

      (4)当c为]时,stk出栈为tmp_,拼接字符串为tmpStr = tmp_+multi.top()*tmpStr

        (5)最终的tmpStr即为最终的结果,返回即可。

    代码:

    class Solution {
    public:
        string decodeString(string s) {
            if (s.empty())   return "";
            stack<int>numStack;
            stack<string>stk;
            string tmpStr="";
            int i=0;
            int multi =0;
            for(auto c:s)
            {
                if(isdigit(c)) multi = 10*multi+c-'0';
                else if(c=='[')
                {
                    numStack.push(multi);
                    multi =0;//归0
                  //碰到[,要将tmpstr先入栈,遇到[时tmpstr不为空,表示存在方括号嵌套
                    stk.push(tmpStr);
                    tmpStr="";
                }
                else if(isalpha(c))  tmpStr = tmpStr + c;
                else
                {
                    string tmp_ = stk.top();stk.pop();
                    int tmpNum = numStack.top();
                    numStack.pop();
                    for(int i=0;i<tmpNum;i++)   tmp_ = tmp_+tmpStr;
                    tmpStr = tmp_;
                }
            }
            return tmpStr;
            
        }
    };
  • 相关阅读:
    一些业内有名的网站收集
    WCF重载
    FCKEditor fckconfig.js配置,添加字体和大小 附:中文字体乱码问题解决
    查询第几条到第几条的数据的SQL语句
    SPOJ 9939 Eliminate the Conflict
    UVA 10534 Wavio Sequence
    HDU 3474 Necklace
    POJ 2823 Sliding Window
    UVA 437 The Tower of Babylon
    UVA 825 Walking on the Safe Side
  • 原文地址:https://www.cnblogs.com/renzmin/p/12984592.html
Copyright © 2011-2022 走看看