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.
思路:1.不为空,长度不为0
2 先从第一个字符开始判断,设置dp数组,第一位为1,第二位得看字符的第一位是否有效。
3 后面每个字符之前的字符串解码数目等于当前位i的前驱之前的字符串i-1解码数目加上当前位前2位i-2之前的字符串解码数目。
4 判断是否有效的方法,先判断当前位是否为0,若为0,返回假,再判断转为整型数字范围是否在1-26.
public int numDecodings(String s) {
if(s==null) return 0;
int len=s.length();
if(len==0) return 0;
int[] dp=new int[len+1];
dp[0]=1;
if(isValid(s.substring(0,1))){
dp[1]=1;
}
else dp[1]=0;
for(int i=2;i<=len;i++){ //可以等于数组长度
if(isValid(s.substring(i-1,i))){
dp[i]=dp[i-1];
}
if(isValid(s.substring(i-2,i))){
dp[i]+=dp[i-2];
}
}
return dp[len];
}
private boolean isValid(String s){
if(s.charAt(0)=='0') return false;
int num=Integer.parseInt(s);
return num>=1&&num<=26;
}