题目:原题链接(中等)

标签:字符串、递归、动态规划

解法 时间复杂度 空间复杂度 执行用时
Ans 1 (Python) O ( 2 N ) O(2^N) O(2N) O ( l o g ( 2 N ) ) O(log(2^N)) O(log(2N)) 48ms (37.92%)
Ans 2 (Python) O ( N ) O(N) O(N) O ( N ) O(N) O(N) 40ms (82.95%)
Ans 3 (Python)

LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,执行用时一般都在同一个量级,仅作参考意义。

解法一(递归):

class Solution:
    @functools.lru_cache(None)
    def numDecodings(self, s: str) -> int:
        if not s or s[0] == "0":
            return 0
        elif len(s) == 1:
            return 1
        elif len(s) == 2:
            if int(s) > 26:
                return self.numDecodings(s[1:])
            else:
                return 1 + self.numDecodings(s[1:])
        elif int(s[:2]) > 26:
            return self.numDecodings(s[1:])
        else:
            return self.numDecodings(s[1:]) + self.numDecodings(s[2:])

解法二(动态规划):

class Solution:
    def numDecodings(self, s: str) -> int:
        stats = []
        last = None
        for ch in s[::-1]:
            if ch == "0":
                stats.append(0)
                last = int(ch)
            elif not stats:  # 处理第一个元素的情况
                stats.append(1)
                last = int(ch)
            elif len(stats) == 1:  # 处理第二个元素的情况
                n = int(ch)
                if 10 * n + last <= 26:
                    stats.append(1 + stats[-1])
                else:
                    stats.append(stats[-1])
                last = n
            else:
                n = int(ch)
                if 10 * n + last <= 26:
                    stats.append(stats[-2] + stats[-1])
                else:
                    stats.append(stats[-1])
                last = n
        return stats[-1]