394. 字符串解碼

394. 字符串解碼

給定一個通過編碼的字符串,返回它解碼後的字符串。css

編碼規則爲: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證爲正整數。編碼

你能夠認爲輸入字符串老是有效的;輸入字符串中沒有額外的空格,且輸入的方括號老是符合格式要求的。spa

此外,你能夠認爲原始數據不包含數字,全部的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。code

示例:blog

s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".leetcode

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;
    }
};
相關文章
相關標籤/搜索