Separate OR Combine
1-26
NOT INCLUDED 0 and >27
s[0]=0 =>0
1,2+0 => res_2
>3+ 0 => 0
0 or 3 + 1-9 => res_1
|-> 2 + 7-9 => res_1
|-> 1 + 1-9 and 2+ 1-6 => res_1 + res_2
0=> s[0] == 0, s[i]==0 , s[i-1] ==0
s[i] == 0
s[i-1]=1 or2 =>res_2
!(s[i-1]=1 or2) => 0
>27 =>
01-09 or 31-39...91-99=>res_1
27,28,29=>res_1,11-19,21-26=>res_1+res_2
s[i] != 0
s[i-1] =0 || s[i-1]= 3 =>res_1
!(s[i-1] =0 || s[i-1]= 3) && s[i-1]=2&&s[i]=7-9 => res_1
!(s[i-1] =0 || s[i-1]= 3) && !(s[i-1]=2&&s[i]=7-9)=> res_1+res_2
1.validate the input(s[i-1] = 0)
0=>0
2. for loop case(s[i]==0)
if case, 1,2+0=>res_2
else case, >3+ 0=>0
3. for loop case(s[i]!=0)
27,28,29 => res_1
21,....26 => res_1 + res_2
11,....19
01,02,...,09(s[i-1] = 0)
31,32,...,39
.. => res_1
91,........,99
A->1
B->2
..
Z->26
s="12"
-> "AB"(1 2) or "L" (12)
2. Implementation
Q1: separate or combine?
A1: 12 can separate and can combine
s[0] =0 => 0 ways
otherwise 1
i=1, s[1] =2, since s[0] <3 and s[1] <7,
s[0], s[1] ways is res[0]
or s[0]s[1] ways is res[-1]
s[i] <= 2 and s[i+1] =0 => only can combine
s[i] <= 2 and s[i+1] <7 => can combine and can separate
s[i] <= 2 and s[i+1] >=7 => only can separate
s[i] > 2 and s[i+1] = 0 => 0
s[i] > 2 and s[i+1] < 7 => only can separate
s[i] > 2 and s[i+1] >=7 => only can separate
public int numDecodings( String s )
{
//validate the input
if ( s == null || s.length() ==0 || s.charAt(0) == '0')
return 0;
int res_2 =1;
int res_1 =1;
int res = 1;
// Case 1: s[i] = 0,
// Case 1-1, 1,2 + 0 => res[i-2]
// Case 1-2, 3,4,5,6,7,8,9 + 0 => 0
// Case 2: s[i] != 0
// Case 2-1: 0, + 1,...,8,9 => res[i-1] @
// Case 2-1: 1, + 1,...,8,9 => res[i-1] + res[i-2]
// Case 2-2: 2 + 1,...,6 => res[i-1] + res[i-2]
// Case 2-3: 2 + 7,8,9 => res[i-1] @
// Case 2-4: 3-9 + 1-9 => res[i-1] @
// Case 3: s[i] < 7, + 1,2,3,4,5,6,7
for ( int i = 1 ; i < s.length() ; i++ )
{
if ( s.charAt(i) == '0' )
{
if ( s.charAt(i-1) == '1' || s.charAt(i-1) == '2' )
res = res_2;
else // 3,4,5,5...9+0, not a case, no way to decode
// res = 0;
return 0;
}
else
{
//if ( s.charAt(i) >= '7' && s.charAt(i-1) == '1' )
// res = res_1 + res_2;
//else
if ( s.charAt(i-1) == '0' || s.charAt(i-1) >='3')
res = res_1; //@
else
{
if ( s.charAt(i-1) == '2' && s.charAt(i) >= '7'&& s.charAt(i) <= '9' )
{
res = res_1; //@
}
else
{
res = res_1 + res_2;
}
}
}
res_2 = res_1;
res_1 = res;
}
return res_1;
}
3. Similar Ones