A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
Java:
public class Solution {
public int numDecodings(String s) {
if(s==null||s.length()==0) return 0;
if(s.charAt(0)=='0') return 0;//if first char is 0, return
int[] res= new int[s.length()+1];
res[0]=1;
for(int i=1;i<=s.length();i++){
char c=s.charAt(i-1);
if(c=='0'){//because we have checked first char, so this c would be at least third digit
if(s.charAt(i-2)=='1'||s.charAt(i-2)=='2'){
res[i]=res[i-2];
}
else{
return 0;
}
}else if(c>='1'&&c<='6'){
if(i==1) res[i]=1;
else{
if(s.charAt(i-2)=='1'||s.charAt(i-2)=='2'){
res[i]=res[i-1]+res[i-2];
}
else{
res[i]=res[i-1];
}
}
}else if(c>='7'&&c<='9'){
if(i==1) res[i]=1;
else{
if(s.charAt(i-2)=='1'){
res[i]=res[i-1]+res[i-2];
}
else{
res[i]=res[i-1];
}
}
}else{
return 0;
}
}
return res[s.length()];
}
}
Reference:
http://blog.csdn.net/linhuanmars/article/details/24570759
第一种新加进来的数字自己比较表示一个字符,那么解析的方式有res[i-1]种;
第二种就是新加进来的数字和前一个数字凑成一个字符,解析的方式有res[i-2]种(因为上一个字符和自己凑成了一个)
public class Solution {
public int numDecodings(String s) {
// input only 0
if(s==null||s.length()==0||s.charAt(0)=='0') return 0;
int num1=1;
int num2=1;
int num3=1;
for(int i=1;i<s.length();i++)
{
//X0
if(s.charAt(i)=='0')
{
if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2')//10,20
{
num3=num1;//res[i]=res[i-2]
}
else{//30,40,50,60,70,80,90,00
return 0;
}
}
//XX
else{
if(s.charAt(i-1)=='0'||s.charAt(i-1)>='3')//01-09,31-99
{
num3=num2;//res[i]=res[i-1]
}
else{
if(s.charAt(i-1)=='2'&& s.charAt(i)>='7'&&s.charAt(i)<='9')//27-29
{
num3=num2;//res[i]=res[i-1]
}
else{//11-19,21-26
num3=num2+num1;//res[i]=res[i-1]+res[i-2]
}
}
}
num1=num2;
num2=num3;
}
return num2;
}
}