给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k
次。注意 k
保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k
,例如不会出现像 3a
或 2[4]
的输入。
示例 1:
输入:s = "3[a]2[bc]" 输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]" 输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef" 输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz" 输出:"abccdcdcdxyz"
提示:
1 <= s.length <= 30
s
由小写英文字母、数字和方括号'[]'
组成s
保证是一个 有效 的输入。s
中所有整数的取值范围为[1, 300]
//递归过程
//e.g. 3[a]
// 1,3[a]>>3,a
//e.g. 3[a2[c]]
// 1,3[a2[c]]>>3,a2[c]>>2,c
class Solution {
public:
bool is_digit(char si){
if(int(si)<65) return true;
return false;
}
string deep(int k,string s){
string res;
for(int i=0;i<s.size();i++){
if(!is_digit(s[i])&&s[i]!='['&&s[i]!=']') res=res+s[i];//直接存储无需解码的字符
if(is_digit(s[i])){
int digk=s[i]-'0';
for(int ii=i+1;ii<s.size();ii++) {
if(is_digit(s[ii])){
digk=digk*10+s[ii]-'0';
i=ii;
}
else break;
}
int cnt=0;//[]配对
int l=i+2;
int r;
for(int j=i+1;j<s.size();j++){
if(s[j]=='[') cnt++;
if(s[j]==']') cnt--;
if(cnt==0) {
r=j-1;
break;
}
}
res=res+deep(digk,s.substr(l,r-l+1));
i=r+1;
}
}
string res0=res;
for(int kk=0;kk<(k-1);kk++) res+=res0;
return res;
}
string decodeString(string s) {
string res;
res=deep(1,s);
return res;
}
};