【python】游程编码?

作者: 阿牛02 | 来源:发表于2019-07-26 08:30 被阅读0次

    题目:字符串“aaaabcccaa”,编码后位变为“4a1b3c2a”。解码则是“3e4f2e”,解码后位”eeefffee“

    分析:基本思路是遍历字符串,然后统计字符出现的次数,再把出现的次数和字符组合在一起。代码不难,但是容易再边界条件上出错。无论是编码还是解码,算法都需要把字符串中的每个字符遍历一次,如果字符串的长度为n,那么算法的时间复杂度为O(n),在编码和解码过程中,代码需要分配一个数组来容纳编码或解码后的字符串,一次空间复杂度为O(n).

    code

    (1)

    def RLEncode(s):

        encodeStr = []

        last = s[0]

        count = 0

        for i in range(len(s)):

            # 遍历每个字符,统计它连续出现的次数

            if s[i] == last:

                count += 1

            else:

                encodeStr.append(str(count))

                encodeStr.append(last)

                count = 1

                last = s[i]

        # 统计最后一个字符及其出现次数,这是容易忽略的边界条件

        encodeStr.append(str(count))

        encodeStr.append(last)

        return ''.join(encodeStr)

    if __name__ == "__main__":

        s = 'aaabcccaa'

        print(RLEncode(s))

    (2)解码。

    def RLEDecode(s):

        decodeStr = []

        i = 0

        digitCount = 0

        while i < len(s):

            # 统计数字字符的个数,它们表示后面字符要出现的次数

            if s[i].isdigit() is True:

                digitCount += 1

                i += 1

            else:

                # 把把数字字符转换为数字

                count = int(s[i - digitCount:i])

                c = s[i]

                # 根据次数添加字符

                for j in range(count):

                    decodeStr.append(c)

                i += 1

                digitCount = 0

        return ''.join(decodeStr)

    if __name__ == "__main__":

        s = "11a1b3c2a"

        print(RLEDecode(s))

    相关文章

      网友评论

        本文标题:【python】游程编码?

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