美文网首页
算法—字符串编码

算法—字符串编码

作者: 土豆骑士 | 来源:发表于2020-04-26 16:48 被阅读0次
题目: 字符串编码(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".

思路:

例如: 以12[a]为例;
1.遍历字符串 S
2.如果当前字符不为方括号"]" 则入栈stack中;
2.如果当前字符遇到了方括号"]" 则:
① 首先找到要复制的字符,例如stack="12[a",那么我要首先获取字符a;将这个a保存在另外一个栈去tempStack;
② 接下来,要找到需要备份的数量,例如stack="12[a",因为出栈过字符"a",则当前的top指向了"[",也就是等于2;
③ 而12对于字符串是2个字符, 我们要通过遍历找到数字12的top上限/下限的位置索引, 此时上限curTop = 2, 下限通过出栈,top = -1;
④ 根据范围[-1,2],读取出12保存到strOfInt 字符串中来, 并且将字符"12\0",转化成数字12;
⑤ 当前top=-1,将tempStack中的字符a,复制12份入栈到stack中来;
⑥ 为当前的stack扩容, 在stack字符的末尾添加字符结束符合'\0';


简易图
char * decodeString(char * s){
   
    int len = (int)strlen(s);//获取字符串长度
    int stackSize = 50;
    char* stack = (char*)malloc(stackSize * sizeof(char));//开辟字符串栈(空间为50)
    int top = -1;//设置栈头指针top = -1;
    
    //遍历字符串,在没有遇到"]" 之前全部入栈
    for (int i = 0; i < len; ++i) {
        if (s[i] != ']') {
            
            if (top == stackSize - 1) {//优化:如果top到达了栈的上限,则为栈扩容;
                stack = realloc(stack, (stackSize += 50) * sizeof(char));
            }
            stack[++top] = s[i];//将字符入栈stack
        } else {
            int tempSize = 10;
            char* temp = (char*)malloc(tempSize * sizeof(char));
            int topOfTemp = -1;
            
            while (stack[top] != '[') {//获取字母,放到 栈temp中
                
                if (topOfTemp == tempSize - 1) {//栈扩容;
                    temp = realloc(temp, (tempSize += 10) * sizeof(char));
                }
               
                ++topOfTemp; //temp栈的栈顶指针自增;
               
                temp[topOfTemp] = stack[top]; //将stack栈顶字符复制到temp栈中来;
               
                top--; //stack出栈,则top栈顶指针递减;
            }            
            //开始获取数字
            char strOfInt[10];
            int curTop = top;   //p记录当前的top;
            
           
            top--; //把"["剔除,才能找到数字;
            //遍历stack得出数字
            //例如39[a] 就要找到这个数字39.
            //p指向当前的top,我就知道上限了; 那么接下来通过循环来找它的数字下限;
            //结束条件:栈指针指向为空! stack[top] 不等于数字
            while (top != -1 && stack[top] >= '0' && stack[top] <= '9') {
                top--;
            }            
            //从top-1遍历到p之间, 把stack[top-1,p]之间的数字复制到strOfInt中来;
            //39中3和9都是字符. 我们要获取到这2个数字,存储到strOfInt数组
            for (int j = top + 1; j < curTop; ++j) {
                strOfInt[j - (top + 1)] = stack[j];
            }
           
            strOfInt[curTop - (top + 1)] = '\0'; //为字符串strOfInt数组加一个字符结束后缀'\0'
           
            int curNum = atoi(strOfInt); //把strOfInt字符串转换成整数 atoi函数;
            for (int k = 0; k < curNum ; ++k) { //把字母复制strOfInt份到stack中去;
                
                //从-1到topOfTemp 范围内,复制curNum份到stackTop中去;
                int kk = topOfTemp;
                while (kk != -1) {
                    
                    if (top == stackSize - 1) {//栈扩容
                        stack = realloc(stack, (stackSize += 50) * sizeof(char));
                    }
                    
                    //将temp栈的字符复制到stack中;
                    //stack[++top] = temp[kk--];
                    ++top;
                    stack[top] = temp[kk];
                    kk--;
                }
            }
            free(temp);
            temp = NULL;
        }
    }
    
    //realloc 动态内存调整;
    //void *realloc(void *mem_address, unsigned int newsize);
    //构成字符串stack后, 在stack的空间扩容.
    char* ans = realloc(stack, (top + 1) * sizeof(char));
    ans[++top] = '\0';
    
    //stack 栈不用,则释放;
    free(stack);
    return ans;
}

相关文章

  • 霍夫曼编码

    问题: 请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短 思路:使用霍夫曼编码构造字符串编码...

  • 二十五、哈夫曼树

    哈夫曼编码(Huffman Coding) 哈夫曼编码,又称为霍夫曼编码,它是现代压缩算法的基础 假设要把字符串【...

  • 18_哈夫曼树

    哈夫曼编码的用途 哈夫曼编码,又称霍夫曼编码,它是现代压缩算法的基础 假设要把字符串【ABBBBCCCCCCCCD...

  • 271. Encode and Decode Strings

    设计一种算法,将字符串列表编码为字符串。 编码后的字符串然后通过网络发送并解码回原始字符串列表。 时间复杂度O(n...

  • 赫夫曼编码

    赫夫曼编码 赫夫曼编码在数据压缩领域有着广泛的应用,压缩率在20%-90%,是一种重要的算法 算法思想(以字符串压...

  • 数据结构与算法(第一季):哈夫曼编码

    一、哈夫曼编码 哈夫曼编码,它是现代压缩算法的基础。 假设把字符串"ABBBCCCCCCDDDDDDEE"转成二进...

  • 算法—字符串编码

    题目: 字符串编码(LeetCode-中等) 编码规则为: k[encoded_string],表示其中方括号内部...

  • base64模块

    模块简介 base64是将任意二进制编码成文本字符串的一种编码算法。具体请参考RFC 3548. 编码原理 bas...

  • KMP 算法中 next 数组手工求解

    KMP算法是一种改进的字符串匹配算法,如果不研究编码的话,手工实现还是比较简单,小型字符串甚至不需要你去求 nex...

  • golang字符串重新编码

    golang 字符串重新编码 golang 字符串重新编码//byte decode/*** function ...

网友评论

      本文标题:算法—字符串编码

      本文链接:https://www.haomeiwen.com/subject/mdulwhtx.html