DDSA Solutions

Total Decoding Messages

Time: O(n)
Space: O(1)
Advertisement

Intuition

Count ways to decode digit string (1=A..26=Z). DP with one and two digit choices.

Algorithm

  1. 1dp[i] = ways to decode s[0..i-1]. dp[i] += dp[i-1] if s[i-1] valid single. dp[i] += dp[i-2] if s[i-2..i-1] in 10..26.

Common Pitfalls

  • Same as LC 91. Handle leading zeros: "0" alone is invalid. "10","20" are valid two-digit decodings.
Total Decoding Messages.java
Java
// Approach: DP. dp[i] = ways to decode s[0..i-1]. One-char decode + two-char decode transitions.
// Time: O(n) Space: O(1)
import java.util.*;

class Solution {
    int[] dp;

    public int countWays(String digits) {
        dp = new int[digits.length() + 1];
        Arrays.fill(dp, -1);
        int ans = countDecodes(0, digits);
        return ans;
    }

    private int countDecodes(int i, String digits) {
        if (i >= digits.length())
            return 1;
        else if (digits.charAt(i) == '0')
            return 0;
        else if (dp[i] != -1)
            return dp[i];

        dp[i] = countDecodes(i + 1, digits);
        int digit1 = digits.charAt(i) - '0';
        if (i + 1 < digits.length() && (digit1 == 1 || (digit1 == 2 && digits.charAt(i + 1) <= '6')))
            dp[i] += countDecodes(i + 2, digits);

        return dp[i];
    }
}
Advertisement
Was this solution helpful?