394. Decode String
Description
Given an encoded string, return it’s decoded string.
The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.
Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won’t be input like 3a or 2[4].
Examples:
s = “3[a]2[bc]”, return “aaabcbc”.
s = “3[a2[c]]”, return “accaccacc”.
s = “2[abc]3[cd]ef”, return “abcabccdcdcdef”.
Analysis
这道题的意思就是讲所给字符串拓展,得到所需结果。
我的做法是利用了递归。
即当前的字符数组的字符串拓展结果等于它[ ]内的字符串拓展结果的整数倍。
注意两个点。一是,下标应该按引用调用,这样才能保证之后调用递归的函数能在递归之后继续进行计算。
第二个是我用了两个index++;这是因为存在’[”]’。
当我们计算子字符串的字符串拓展结果时,不应该连着’[‘。
同样当我们计算完子字符串的结果时,我们应该忽略子字符串的’]’来继续计算。
Code
class Solution {
public:
string res(const string& s, int& index) {
string str;
while (index < s.length() && s[index] != ']') {
if (!isdigit(s[index])) str.push_back(s[index++]);
else {
int num = 0;
while (index < s.size() && isdigit(s[index])) num = num*10+s[index++]-'0';
index++;
string temp = res(s, index);
index++;
while (num--) str += temp;
}
}
return str;
}
string decodeString(string s) {
int index = 0;
return res(s, index);
}
};