394. 字符串解码

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

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

class Solution {
public:
    string decodeString(string s) {
        stack<int>num;
        stack<char>st;
        string re;

        for(int x=0;x<s.size();x++)
        {
            if(s[x]>='0'&&s[x]<='9')
            {
                string n;
                n+=s[x];
                while(s[x+1]>='0'&&s[x+1]<='9')
                {
                    x++;
                    n+=s[x];
                }
                num.push(stoi(n));
            }
            else if(s[x]=='['||(s[x]>='a'&&s[x]<='z'))
            {
                st.push(s[x]);
            }
            else
            {
                string tmp;
                char a=st.top();
                st.pop();
                while(a!='[')
                {
                    tmp=tmp+a;
                    a=st.top();
                    st.pop();
                }
                reverse(tmp.begin(),tmp.end());
                // tmp.clear();
                cout<<tmp<<endl;
                string ok;
                int b=num.top();
                num.pop();
                for(int i=0;i<b;i++)
                {
                    ok=ok+tmp;
                }
                cout<<"re:"<<ok<<endl;
                for(int i=0;i<ok.size();i++)
                {
                    st.push(ok[i]);
                }
            }
        }
        while(!st.empty())
        {
            re+=st.top();
            st.pop();
        }
        reverse(re.begin(),re.end());
        return re;
    }
    
};
posted @ 2024-05-09 16:17  东岸  阅读(17)  评论(0)    收藏  举报