给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
char *recurcive(char *s, char **tial, int *len)
{
char *phead = s; /* include */
char *ptial = s; /* exclude */
char *str = malloc(0);
if (isalpha(*s)) { /* start with alpha, pure string */
while(isalpha(*ptial)) {
ptial ++;
}
*tial = ptial;
*len = ptial - phead;
str = realloc(str, (*len)+1);
memcpy(str, s, ptial - phead);
str[*len] = '\0';
} else { /* start with number, pure string */
int num = 0;
int reslen = 0;
char *restial = NULL;
char *res = NULL;
while (*ptial && (*ptial != '[')) { /* get num, ptial -> '[' */
num *= 10;
num += (*ptial - '0');
ptial++;
}
phead = ++ptial;
*len = 0;
while (*ptial != ']') {
if (isdigit(*ptial)) {
res = recurcive(ptial, &restial, &reslen);
str = realloc(str, (*len)+reslen+1);
memcpy(&str[*len], res, reslen);
(*len) += reslen;
ptial = restial;
} else {
str = realloc(str, (*len)+1+1);
str[*len] = *ptial; /* append to tial */
(*len) ++;
}
ptial ++;
}
}
return str;
}
char * decodeString(char * s){
char *head = s;
int len = 0;
char *tial = s;
char *ret = NULL;
while (*tial) {
ret = recurcive(head, &tial, &len);
printf("%s", ret);
while (*tial && *tial == ']') {
tial++;
}
head = tial;
}
return ret;
}
int main()
{
char *s = decodeString("aa2[bb3[cc]5[e]]4[dd]");
}