<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;
    }
};


猜你喜欢

转载自www.cnblogs.com/Dancing-Fairy/p/12766795.html