zoukankan      html  css  js  c++  java
  • <leetcode c++> 394. 字符串解码

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

    class Solution {
    public:
        bool isNum(char c){
            return c>='0'&&c<='9';
        }
        bool add(stack<string>& ss, char c){
            if(ss.empty()||c=='['||ss.top()[0]=='[')return false;
            return ((isNum(ss.top()[0])&&isNum(c))||(!isNum(ss.top()[0])&&!isNum(c)));
        }
        string decodeString(string s) {
            stack<string> st;
            for(int i=0;i<s.length();i++){
                if(s[i]!=']'){
                    if(add(st,s[i]))st.top()+=s[i];
                    else{
                        string tmp="";tmp+=s[i];
                        st.push(tmp);
                    }
                }
                else
                {
                    string tmp=st.top();st.pop();
                    while(st.top()!="["){
                        if(isNum(st.top()[0])){
                            string a="";
                            for(int j=0;j<stoi(st.top());j++){
                                a=a+tmp;
                            }
                            tmp=a;
                        }
                        else
                            tmp=st.top()+tmp;
                
                        st.pop();
                    }
                    st.pop();
                    if(isNum(st.top()[0])){
                        string a="";
                        for(int j=0;j<stoi(st.top());j++){
                            a=a+tmp;
                        }
                        tmp=a;
                    }
                    else
                        tmp=st.top()+tmp;
                
                    st.pop();
                    st.push(tmp);
                }
            }
            string res="";
            while(!st.empty()){
                res=st.top()+res;
                st.pop();
            }
            return res;
        }
    };


  • 相关阅读:
    汉罗塔问题
    有进度条圆周率计算
    turtle库笔记
    OwnCloud建立属于自己私有的云存储网盘
    HTTP 常见请求状态码
    虚拟机部署Kubernetes集群
    常用文件头(16进制)
    配置LAMP环境
    Linux系统日志
    Java的socket通信与操作系统的SocketAPI关系探究
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12766795.html
Copyright © 2011-2022 走看看