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".
思想:借助栈来实现
以下用a2[b]举例子:
- 当遇到'[',把'['和与之匹配的']'之间的字母需要重复的次数和'['之前的字符进栈,本例中进栈{2,a}
- 当遇到']',代码中的字符串res即:b,就是要重复的字母,此时出栈之前进栈的{2,a},res变成a+2*b = abb
- 部分注意事项看注释即可
代码:
class Solution { public: typedef pair<int,string> pis; string repeat(const string &s, int times){ string retString = ""; for(int i=0;i<times;i++) retString += s; return retString; } string decodeString(string s) { vector<pis> vecStack; string res = ""; int repeatTime = 0; for(auto i:s){ if(i>='0' && i<='9'){ repeatTime = repeatTime * 10 + (i - '0'); } else if(i == '['){ vecStack.push_back({repeatTime,res}); ////用vector代替stack,更高效,因为stack底层可以是vector res = ""; //进栈后要更新res和repeatTimes repeatTime = 0; } else if(i == ']'){ pis tmp = vecStack[vecStack.size()-1]; vecStack.pop_back(); res = tmp.second + (tmp.first == 0?"":repeat(res,tmp.first)); } else res += i; } return res; } };