题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”.
来源:力扣(LeetCode)
思路
首先,把一个括号中的所有内容看成一个整体,一次递归函数返回一对括号中解码后的字符串;
其次,给定的编码字符串实际上只有四种字符,数字,字母和左右括号,所以开始用一个变量i
从0
开始遍历到字符串的末尾,由于左括号都是跟在数字后面,所以先遇到的字符只能是数字或者字母,如果是字母,直接存入结果中,如果是数字,循环读入所有的数字,并正确转换,那么下一位非数字的字符一定是左括号,指针右移跳过左括号,对之后的内容调用递归函数求解;
再次,注意循环的停止条件是遍历到末尾和遇到右括号,由于递归调用的函数返回了子括号里解码后的字符串,而我们之前把次数也已经求出来了,那么循环添加到结果中即可。
C++代码
class Solution {
public:
string decodeString(string s)
{
int i = 0;
return decode(s, i);
}
string decode(string s, int& i)
{
string res = "";
int n = s.size();
while (i < n && s[i] != ']')
{
if (s[i] < '0' || s[i] > '9')
{
res += s[i++];
}
else
{
int cnt = 0;
while (s[i] >= '0' && s[i] <= '9')
{
cnt = cnt * 10 + s[i++] - '0';
}
++i;
string t = decode(s, i);
++i;
while (cnt-- > 0)
{
res += t;
}
}
}
return res;
}
};
来源:CSDN
作者:空谷-幽兰
链接:https://blog.csdn.net/weixin_40482465/article/details/104679936