题目:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k
次。注意 k
保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k
,例如不会出现像 3a
或 2[4]
的输入。
示例:
- 输入: s = " 3 [ a ] 2 [ b c ] " s = "3[a]2[bc]" s="3[a]2[bc]"
- 输出: " a a a b c b c " "aaabcbc" "aaabcbc"
解题思路:递归
从左到右解析字符串,若当前字符为单个字母,则加入到结果res
中,若为数字,则统计数字位数,然后记录下来,再将下标加一,跳过左括号,递归更内层的字符,然后跳过右括号,最后再回溯的过程中,根据位数将相应的字母加入到结果中。
class Solution {
public:
string decodeString(string s) {
int u = 0;
return dfs(s, u);
}
string dfs(string& s, int& u){
string res;
while(u < s.size() && s[u] != ']'){
if(s[u] >= 'a' && s[u] <= 'z' || s[u] >= 'A' && s[u] <= 'Z') res += s[u++];
else if(s[u] >= '0' && s[u] <= '9'){
int k = u;
while(s[k] >= '0' && s[k] <= '9') k++;
int x = stoi(s.substr(u, k - u));
u = k + 1; // 过滤掉左括号
string y = dfs(s, u);
u++; // 过滤掉右括号
while(x--) res += y;
}
}
return res;
}
};