394. Decode String

思路:
这个题 很明显用栈来处理,但是,我有思路了,一做就错,自己写的乱乱的,理不清楚逻辑了。
首先我们需要两个栈一个用来放数字,一个用来放字符串。当我们遇到'['时,就把上次的暂存的字符串和得到的数字大小分别放入各自的栈中。如果遇到']'就开始取出栈顶的数字,并且以这个大小循环这多次,把存放字符串的栈顶元素加自己。然后取出这个字符串。取出来的原因是因为结束了这次的']',如果我们下次可能还是字母,那么这个字符串和新的字母是同一级别的,我们还要加入到这个字符串中。如果是'[',那么就会把他放回栈里不会有影响。
代码:

class Solution {
public:
    string decodeString(string s) {
        string res="";
        stack<int> nums; 
        stack<string> str;
        int num=0;
        int len = s.length();
        for(int i=0;i<len;++i){
            if(s[i]>='0'&&s[i]<='9'){ //计算前面数字的大小,可能不是一位数
                num = num*10+s[i]-'0';
            }
            else if((s[i]>='a'&&s[i]<='z')||s[i]>='A'&&s[i]<='Z'){ //遇到字母就加入res
                res += s[i];
            }
            else if(s[i]=='['){  //遇到'['就将res和num分别放入数组,是结束上一次的[获得的元素,并准备这一次的'['的新元素
                nums.push(num);
                num=0;
                str.push(res);
                res="";
            }
            else if(s[i]==']'){ 
                int times = nums.top();
                nums.pop();
                while(times--){
                    str.top() += res;
                }
                res=str.top(); //主要是为了]之后还是字母的情况,因为是同一级别的,所以还要加入res中。如2[A]A,这两个A是同一级的。
                str.pop();
            }
        }
        return res;
    }
};
posted @ 2021-04-28 19:38  Mrsdwang  阅读(29)  评论(0编辑  收藏  举报