字符串解码-遍历

字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”.

解题思路:
以s="a2[bc3[d]ef2[gh]]zz"为例
遍历整个字符串s,字母存放在tmp1中,数字存放在tmp2中,遇到’[‘则将tmp1放入letters容器中,tmp2以int类型存放到nums的堆栈中,遇到’]‘则开始解码,解码后的字符串存放在res中:
1.若s[i]为字母,首先判断nums中是否已存放数字
a. 若没有,则res+=s[i];
b. 若有,则将字符暂存到tmp1中,tmp1+=s[i];
2.若s[i]为数字,考虑会有多位数的情况,先将其存放到tmp2中:tmp2+=s[i];
3.若s[i]=’[’:则将tmp1存入letters中,tmp2存入nums中,并清空tmp1、tmp2;
4.若s[i]=’]’:则开始进行解码,此时]前的字符串还存放在tmp1中,循环nums.top()次,res_tmp+=tmp1;之后将nums.top()弹出,判断nums中是否还存放数字
a. 若还存放数字,则res_tmp添加到letters.back()之前,tmp1= tmp1=letters.back()+res_tmp;弹出letters.back(),让tmp1继续循环;
b. 若不再存放数据,则res_tmp添加到res之后;

class Solution {
public:
    string decodeString(string s) {
        stack<int> nums;
        vector <string> letters;
        string tmp1="",tmp2="",res="";
        for ( int i=0;i<s.length();i++ ){
            if ((s[i]>='a'&&s[i]<='z') || (s[i]>='A'&&s[i]<='Z')){
                if (nums.empty()) res+=s[i];
                else tmp1+=s[i];
            }
            if ( s[i]>='0' && s[i]<='9') {
                tmp2.push_back(s[i]);
            }
            if ( s[i]=='[') {
                letters.push_back(tmp1);
                nums.push(stoi(tmp2));
                tmp1="";
                tmp2="";
            }
            if ( s[i]==']'){
                string res_tmp="";
                for (int j=0;j<nums.top();j++) {
                    res_tmp+=tmp1;
                    }
                    nums.pop();
                if (!nums.empty()){
                    tmp1=letters.back()+res_tmp;
                    letters.pop_back();
                }
                else res=res+res_tmp;
            }
        }return res;
    }
};

你可能感兴趣的:(C++)