class Solution:
    def numDecodings(self, s: str) -> int:
        """1에서 26까지 숫자를 알파벳으로 치환할 수 있을때,
        주어진 숫자 문자열이 어떤 알파벳으로 치환 될 수 있는지 방법의 수를 찾는 함수

        방법:
        1. 경우의 수를 찾는 경우는 대부분 DP..?
        - 케이스가 명확함.
            현 위치의 숫자가 0이 아닌 경우, 해당 자리가 앞 숫자와 별개로 1~9 사이의 숫자를 선택할 수 있다.
            만약 앞의 경우를 포함해서 숫자가 10에서 26사이면 앞의 경우를 포함해서 경우의 숫자를 생각해야 함.
        다만 첫번째 숫자가 0이면 넘어가야 함.
        시간 복잡도: O(n) 공간 복잡도: O(n)

        Args:
            s (str): 숫자로 이루어진 문자열

        Returns:
            int: 문자열로 치환할 수 있는 알파벳 구성의 수
        """
        dp = [0] * len(s)
        if s[0] != "0":
            dp[0] = 1
        for i in range(1, len(s)):
            if s[i] != "0":
                dp[i] += dp[i - 1]
            if "10" <= s[i - 1 : i + 1] <= "26":
                dp[i] += dp[i - 2] if i > 1 else 1
        return dp[-1]
