Skip to content

Commit 86a1306

Browse files
authored
Merge pull request #716 from Karnika06/Devincept7
Added Decode Ways II (LeetCode) problem
2 parents 9e84a88 + 87f3645 commit 86a1306

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed

Strings/DecodeWaysII.java

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Implementation of Decode Ways II problem from LeetCode(Hard)
3+
*
4+
* Problem link: https://leetcode.com/problems/decode-ways-ii/
5+
*
6+
* Time Complexity: O(n)
7+
* Space Complexity: O(n)
8+
*/
9+
10+
import java.util.*;
11+
import java.io.*;
12+
13+
class DecodeWaysII
14+
{
15+
public int numDecodings(String s)
16+
{
17+
long[] dp=new long[s.length()+1];
18+
dp[0]=1;
19+
dp[1]= decodeChar(s.charAt(0));
20+
for(int i=2;i<=s.length();i++)
21+
{
22+
23+
char prev=s.charAt(i-2);
24+
char curr=s.charAt(i-1);
25+
26+
//single character decoding
27+
dp[i] += dp[i-1]*decodeChar(curr);
28+
29+
//double character decoding
30+
dp[i] += dp[i-2]*decodeTwoChars(prev, curr);
31+
32+
dp[i] = dp[i]%1000000007;
33+
}
34+
return (int)dp[s.length()];
35+
}
36+
37+
private int decodeChar(char c)
38+
{
39+
if(c=='*')
40+
return 9;
41+
else if(c=='0')
42+
return 0;
43+
44+
return 1;
45+
}
46+
47+
private int decodeTwoChars(char first, char second)
48+
{
49+
switch(first)
50+
{
51+
case '*':
52+
if(second == '*')
53+
return 15;
54+
else if(second>='0' && second<='6')
55+
return 2;
56+
else
57+
return 1;
58+
59+
case '1':
60+
if(second == '*')
61+
return 9;
62+
else
63+
return 1;
64+
65+
case '2':
66+
if(second == '*')
67+
return 6;
68+
else if(second >= '0' && second <= '6')
69+
return 1;
70+
else
71+
return 0;
72+
default:
73+
return 0;
74+
}
75+
}
76+
77+
public static void main(String args[])
78+
{
79+
Scanner sc = new Scanner(System.in);
80+
String str = sc.nextLine();
81+
DecodeWaysII ob = new DecodeWaysII();
82+
System.out.println(ob.numDecodings(str));
83+
}
84+
}
85+
86+
/*
87+
* Example 1:
88+
89+
Input: s = "*"
90+
Output: 9
91+
Explanation: The encoded message can represent any of the encoded messages "1", "2", "3", "4", "5", "6", "7", "8", or "9".
92+
Each of these can be decoded to the strings "A", "B", "C", "D", "E", "F", "G", "H", and "I" respectively.
93+
Hence, there are a total of 9 ways to decode "*".
94+
95+
Example 2:
96+
97+
Input: s = "1*"
98+
Output: 18
99+
Explanation: The encoded message can represent any of the encoded messages "11", "12", "13", "14", "15", "16", "17", "18", or "19".
100+
Each of these encoded messages have 2 ways to be decoded (e.g. "11" can be decoded to "AA" or "K").
101+
Hence, there are a total of 9 * 2 = 18 ways to decode "1*".
102+
103+
Example 3:
104+
105+
Input: s = "2*"
106+
Output: 15
107+
Explanation: The encoded message can represent any of the encoded messages "21", "22", "23", "24", "25", "26", "27", "28", or "29".
108+
"21", "22", "23", "24", "25", and "26" have 2 ways of being decoded, but "27", "28", and "29" only have 1 way.
109+
Hence, there are a total of (6 * 2) + (3 * 1) = 12 + 3 = 15 ways to decode "2*".
110+
*/

0 commit comments

Comments
 (0)