ASCII code decode to string I am working on this question and have my answer as following?

A string is encoded by performing the following sequence of actions:

Replace each character with its ASCII value representation.
Reverse the string.

For example, the table below shows the conversion from the string  &quot;HelloWorld&quot; to the ASCII string &quot;7210110810811187111114108100&quot;:
Character
H  e   l   l   o    W  o   r   l   d
ASCII Value
72 101 108 108 111  87 111 114 108 100

The ASCII string is then reversed to get the encoded string &quot;0018014111117811180180110127&quot;.
The characters in encoded string are within the range 10 - 126 which include special characters.

Example:
asciidecode('111111') =&gt; '\x0b\x0b\x0b' or 'oo'
because we can split the
input 111111 (after reverse back: '111111') like 11,11,11 or 111,111
from typing import List

def asciidecode(self, s: str) -&gt; List:
    if not s: return ''
    s = s[::-1]
    n = len(s)
    ch_map = {str(i): chr(i) for i in range(10, 127)}
    dp = [[''] for _ in range(n + 1)]
    dp[2] = [ch_map[s[:2]]] if s[:2] in ch_map else ''
    dp[3] = [ch_map[s[:3]]] if s[:3] in ch_map else ''
    dp[4] = [dp[2][0] + ch_map[s[2:4]]] if s[2:4] in ch_map else ''
    for i in range(5, n + 1):
        p1 = s[i - 2: i]
        p2 = s[i - 3: i]
        tmp = []
        if p1 in ch_map:
            tmp += [i + ch_map[p1] for i in dp[i - 2]]
        if p2 in ch_map:
            tmp += [i + ch_map[p2] for i in dp[i - 3]]
        dp[i] = tmp
    return dp[-1]
return '' doesn't have the type List.
List means List[Any], you should use List[str].
Your variable names are garbage.


s -> string
n -> length
ch_map -> char_map or character_map
dp -> what does this even mean?
p1 -> position_1?

Don't put return statements on the same line as an if.
Again strings shouldn't be assigend to lists, yes you can iterate over them because they're both sequences. But they're not the same type. [ch_map[s[:2]]] if s[:2] in char_map else ''
ch_map should be a constant outside the function.
It's far easier to understand your code if it's written using recursion.
Recursion has some problems, and so it should be written in a way that allows you to easily convert it to a while loop.




CHAR_MAP = {str(i): chr(i) for i in range(10, 127)}


def asciidecode(string: str) -&gt; List[str]:
    if not string:
        return []
    string = string[::-1]
    length = len(string)

    def inner(index):
        if index == length:
            yield ''
        else:
            for size in (2, 3):
                if length &lt; index + size:
                    break
                letter = CHAR_MAP.get(string[index:index + size])
                if letter is not None:
                    for word in inner(index + size):
                        yield letter + word
    return list(inner(0))


def asciidecode_pre_while(string: str) -&gt; List[str]:
    if not string:
        return []
    string = string[::-1]
    length = len(string)
    output = []

    def inner(index, word):
        if index == length:
            output.append(word)
            return

        for size in (2, 3):
            if length &lt; index + size:
                break
            letter = CHAR_MAP.get(string[index:index + size])
            if letter is not None:
                inner(index + size, word + letter)
    inner(0, '')
    return output


From the second one it's easy to convert it to a while loop:

CHAR_MAP = {str(i): chr(i) for i in range(10, 127)}


def asciidecode(string: str) -&gt; List[str]:
    if not string:
        return []
    string = string[::-1]
    length = len(string)
    output = []

    stack = [(0, '')]
    while stack:
        index, word = stack.pop()
        if index == length:
            output.append(word)
            continue

        for size in (2, 3):
            if length &lt; index + size:
                break
            letter = CHAR_MAP.get(string[index:index + size])
            if letter is not None:
                stack.append((index + size, word + letter))
    return output