In Decode Ways problem we have given a non-empty string containing only digits, determine the total number of ways to decode it using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Table of Contents
Example
S = “123”
Number of ways to decode this string is 3
If we look closely at the problem then we can observe that all the one-digit number except 0 are valid but in case of two-digit number only numbers from 10 to 26 are valid.
Hence we can conclude that at every index we have two steps:
1. If the ith element of a string is not ‘0’ then we have one way to decode the string starting with ith index using the mapping:
'A' -> 1 'B' -> 2 …. 'I' -> 9
2. If we can merge the ith and (i+1)th index together to form a valid number using the following mapping:
'J' -> 10 'K' -> 11 …. 'Z' -> 26
Then we have one more way to decode the string starting with ith index.
Algorithm for Decode Ways
Step 1: Declare and initialize a 1D array of size n with zero.
Step 2: Check if we can decode the string which starts and ends both at (n-1)th index( Base case ).
Step 3: Run a loop and check at every step if we can use the ith index element as one digit valid number or merge it with (i+1)th index element to form a valid number of two digit.
- If s[i]!=’0’, then dp[i]+=dp[i+1]
- If s[i]==’1’, then dp[i]+=dp[i+2]
- If s[i]==’2’ and s[i+1]<=’6’, then dp[i]+=dp[i+2]
Step 4: Return dp[0].
Implementation
C++ program for Decode Ways
#include<bits/stdc++.h> using namespace std; int numDecodings(string s) { int n=s.length(); int dp[n+1]; memset(dp,0,sizeof(dp)); dp[n]=1; if(s[n-1]!='0'){ //if the last chararcter is not zero then we have one way to decode it dp[n-1]=1; } for(int i=n-2;i>=0;i--){ if(s[i]!='0'){ dp[i]+=dp[i+1]; } if(s[i]=='1'){ dp[i]+=dp[i+2]; } if(s[i]=='2'){ if(s[i+1]<='6'){ dp[i]+=dp[i+2]; } } } return dp[0]; } int main(){ string s="452625"; cout<<"The number of ways to decode the given string is: "<<numDecodings(s); }
The number of ways to decode the given string is: 4
JAVA program for Decode Ways
public class Main { public static int numDecodings(String s) { int n=s.length(); int[] dp=new int[n+1]; dp[n]=1; if(s.charAt(n-1)!='0'){ //if the last chararcter is not zero then we have one way to decode it dp[n-1]=1; } for(int i=n-2;i>=0;i--){ dp[i]=0; if(s.charAt(i)!='0'){ dp[i]+=dp[i+1]; } if(s.charAt(i)=='1'){ dp[i]+=dp[i+2]; } if(s.charAt(i)=='2'){ if(s.charAt(i+1)<='6'){ dp[i]+=dp[i+2]; } } } return dp[0]; } public static void main(String[] args) { String s="23572"; System.out.println("The number of ways to decode the given string is: "+numDecodings(s)); } }
The number of ways to decode the given string is: 2
Complexity Analysis for Decode Ways
Time complexity: O(n) where n is the length of the given string.
We are traversing the given string only once hence the complexity is O(n)
Space complexity: O(n) because we store the number of ways at each step in dp array which leads us to linear space complexity.