题目链接:https://leetcode.com/problems/decode-ways/description/
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.
参考链接:http://blog.youkuaiyun.com/linhuanmars/article/details/24570759
dp[i]表示字符串数组前i个字符(即arr[0...i-1])解码方法数;下面代码for循环是以当arr[i]考虑的,它对应的结果为dp[i+1]
public int numDecodings(String s){
if(s==null||s.length()==0 || s.charAt(0)=='0')
return 0;
int[] dp=new int[s.length()+1];
dp[0]=1;
char[] str=s.toCharArray();
if(str[0]=='0')
dp[1]=0;
else
dp[1]=1;
for(int i=1;i<s.length();i++){
if(str[i]=='0'){ //当前字符为0
if(str[i-1]=='1'||str[i-1]=='2') //上一个字符为1或2
dp[i+1]=dp[i-1];
else
dp[i+1]=0;
}
else{ //当前字符不是0
if(str[i-1]=='0'||str[i-1]>='3') //上一个字符为0或3
dp[i+1]=dp[i];
else if(str[i-1]=='2'&&str[i]>='7'&&str[i]<='9')
dp[i+1]=dp[i];
else{
dp[i+1]=dp[i]+dp[i-1];
}
}
}
return dp[s.length()];
}