给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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".
class Solution {
public:
string decodeString(string s) {
string res;
for (int i = 0; i < s.size();)
{
if (!isdigit(s[i])){// 如果当前的字母不是数字的话
res += s[i];// 那么我们把结果加一下,加起来
i ++;
}
else
{
int j = i;
while (isdigit(s[j])) j ++;// 如果为数字的话,那么 j+1;
int t = atoi(s.substr(i, j - i).c_str());// 这里是把字符串的数字转换为了数字
int k = j + 1, sum = 0;// 在这里我们定义一下k 为j 的下一个位置
while (sum >= 0)
{
if (s[k] == '[') sum ++ ; //如果是 '[‘的话, 那么 sum+1;
if (s[k] == ']') sum -- ; //如果是 ’]‘的话, 那么 sum-1;
k ++ ;
}
string str = decodeString(s.substr(j + 1, k - j - 2));//在这里进行递归求解出来字符串的长度
while (t -- ) res += str;//最后将结果加起来
i = k;
}
}
return res; // 把结果返回去
}
};
// 加油,加油。。。 Try to make yourself more excellent...