394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a
或 2[4]
的输入。
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
思路:玄学递归。我的思路本来也是要用递归,但是很多细节方面没有考虑到,例如’[‘这个方括号的处理,我是直接判断当前字符是不是方括号,如果是方括号,则一直查找到对应的’]‘为止,中间的字符串就是一个子串。这就导致了,如果连续出现多个’[’,那就完蛋。方括号也会放在子字符串里。其次,递归的返回值,我只返回了本次的结果,没有返回后面的结果,正确的答案是,返回“本次+往后”。
class Solution {
private:
int get_digit(string& s,int &index) {
int num = 0;
while (index < s.length() && isdigit(s[index]))
num = num * 10 + s[index++] - '0';
return num;
}
string get_str(string& s,int &index) {
// 递归的出口,前一个很容易想到,后一个作为递归出口的条件,更加方便
if (index >= s.length() || ']' == s[index])
return "";
string str;
if (isdigit(s[index])){// 如果是数字,先获取重复的次数,再获取字符串
int cnt = get_digit(s,index);// 获取重复的次数
index++;// 精髓,跳过'['符号
string temp = get_str(s,index);// 获取下一个字符串
index++;// 精髓,跳过']'符号
while (cnt--)
str += temp;// 重复添加字符串
}
else {// 如果不是数字,则直接获取字符串
while (isalpha(s[index]))
str += s[index++];
}
// 返回这一次的结果+后面的结果
return str+get_str(s,index);
}
public:
string decodeString(string s) {
int i = 0;
return get_str(s,i);
}
};