Comparing algorithms to decode a String
They both look like they are \$O(n)\$.

A quick check with timeit show they both take essentially the same amount of time, and the time grows linearly with the length of the input string.

It would be better to iterate over the characters in the string rather use an explicit index over the length of the string (while curr &lt; len(s) is often a smell).

def decoding(s):
    result = []
    repeat = 0

    for c in s:
        if c.isdigit():
            repeat = 10 * repeat + int(c)

        else:
            result.append(repeat * c)
            repeat = 0

    return ''.join(result)


or:

def decoding(s):
    result = []
    prev_index = 0

    for index,c in enumerate(s):
        if not c.isdigit():
            result.append(int(s[prev_index:index]) * c)
            prev_index = index + 1

    return ''.join(result)