【leetcode-字符串编码】

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: 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)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

#define ARRAY_STATCK 1
#ifdef ARRAY_STATCK
/* 数据域结构 */
typedef struct _StackNode {
    int multi; /* 倍数 */
    char str[10000]; /* 字符串 */
} StackNode;

typedef struct {
    int top; /* 栈顶位置 */
    int maxSize; /* 栈中最多存放的元素 */
    StackNode *arrayStack; /* 栈元素数组 */
} ArrayStack;

typedef ArrayStack Stack;

/***********栈的操作*************/
void StackInit(Stack *stack, unsigned int size); /* 初始化一个栈 */
bool StackPush(Stack *stack, const StackNode *data); /* 元素压栈 */
bool StackPop(Stack *stack, StackNode *stackNode); /* 删除栈顶元素 */
StackNode *StackTop(Stack *stack); /* 返回栈顶元素 */
void StackFree(Stack *stack); /* 清空栈 */

/* 初始化一个栈 */
void StackInit(Stack *stack, unsigned int size)
{
    stack->maxSize = size;
    stack->top = -1;
    if (size != 0) {
        stack->arrayStack = (StackNode *)malloc(sizeof(StackNode) * size);
        if (stack->arrayStack == NULL) {
            printf("stack malloc error");
            return;
        }
        memset(stack->arrayStack, 0, sizeof(StackNode) * size);
    }
    return;
}

/* 释放栈 */
void StackFree(Stack *stack)
{
    if (stack != NULL) {
        free(stack->arrayStack);
    }
    return;
}

/* 判断栈是否为空 */
bool StackIsEmpty(Stack *stack)
{
    if (stack == NULL || stack->top < 0) {
        return true;
    }
    return false;
}

#define ADD_CAPA 10
/* 栈空间动态扩展 */
static bool StackMallocNew(Stack *stack)
{
    StackNode *newStack = NULL;

    newStack = (StackNode *)malloc(sizeof(StackNode) * (stack->maxSize + ADD_CAPA));
    if (newStack == NULL) {
        return false;
    }
    memset(newStack, 0, sizeof(StackNode) * (stack->maxSize + ADD_CAPA));
    memcmp(newStack, stack->arrayStack, sizeof(StackNode) * stack->maxSize);
    free(stack->arrayStack);
    stack->arrayStack = newStack;
    stack->maxSize = stack->maxSize + 10;

    return true;
}

/* 元素压栈 */
bool StackPush(Stack *stack, const StackNode *data)
{
    if (stack == NULL || data == NULL) {
        return false;
    }
    if (stack->top == stack->maxSize - 1) {
        printf("is full stack,alloc new");
        /* 可以动态扩充栈的大小 */
        if (StackMallocNew(stack) != true) {
            return false;
        }
    }
    stack->top++;
    stack->arrayStack[stack->top].multi = data->multi;
    snprintf(stack->arrayStack[stack->top].str, sizeof(stack->arrayStack[stack->top].str), "%s", data->str);

    return true;
}

/* 删除栈顶元素 */
bool StackPop(Stack *stack, StackNode *stackNode)
{
    StackNode *result = NULL;
    
    if (stack == NULL || stackNode == NULL) {
        return false;
    }
    /* 空栈 */
    if (StackIsEmpty(stack) == true) {
        return false;
    }
    stackNode->multi = stack->arrayStack[stack->top].multi;
    snprintf(stackNode->str, sizeof(stackNode->str), "%s", stack->arrayStack[stack->top].str);
    stack->top--;

    return true;
}
#endif

#define MAX_DECODE_LEN 10000

char *decodeString(char * s)
{
    int i,j;
    int len = 0;
    int multi = 0;
    char *res = NULL;
    Stack stack;
    StackNode stackNode;
    StackNode popStackNode;
    int tempMulti = 0; /* 存储出栈结果 */
    char tempres[10000] = {0}; /* 存储出栈结果 */

    if (s == NULL) {
        return NULL;
    }
    len = strlen(s);

    res = (char *)malloc(sizeof(char) * MAX_DECODE_LEN);
    if (res == NULL) {
        return NULL;
    }
    memset(res, 0, sizeof(char) * MAX_DECODE_LEN);

    StackInit(&stack, 100);

    for (i = 0; i < len; i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            multi = multi * 10 + s[i] - '0';
        } else if (s[i] =='[') {
            memset(&stackNode, 0, sizeof(stackNode));
            stackNode.multi = multi;
            snprintf(stackNode.str, sizeof(stackNode.str), "%s", res);
            StackPush(&stack, &stackNode);
            multi = 0;
            memset(res, 0, MAX_DECODE_LEN); /* 清空结果集 */
        } else if (s[i] == ']') {
            memset(&popStackNode, 0, sizeof(popStackNode));
            StackPop(&stack, &popStackNode);
            tempMulti = popStackNode.multi;
            memset(tempres, 0, sizeof(tempres));
            for (j = 0; j < tempMulti; j++) {
                strcat(tempres, res);
            }
            memset(res, 0, MAX_DECODE_LEN); /* 清空结果集 */
            strcat(res, popStackNode.str);
            strcat(res, tempres);
        } else {
            snprintf(res + strlen(res), MAX_DECODE_LEN - strlen(res), "%c", s[i]);
        }
    }
    StackFree(&stack);
    return res;
}

 

你可能感兴趣的:(leetcode)