A message containing letters from A-Z
is being encoded to numbers using the following mapping way:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Beyond that, now the encoded string can also contain the character '*', which can be treated as one of the numbers from 1 to 9.
Given the encoded message containing digits and the character '*', return the total number of ways to decode it.
Also, since the answer may be very large, you should return the output mod 109 + 7.
Example 1:
Input: "*" Output: 9 Explanation: The encoded message can be decoded to the string: "A", "B", "C", "D", "E", "F", "G", "H", "I".
Example 2:
Input: "1*" Output: 9 + 9 = 18
Note:
- The length of the input string will fit in range [1, 105].
- The input string will only contain the character '*' and digits '0' - '9'.
public class Solution {
//*不能表示0
static final int MOD=(int) (Math.pow(10, 9)+7);
public int numDecodings(String s) {
if(s.length()==0) return 0;
long[] dp=new long[s.length()+1];
dp[0]=1;
if(s.charAt(0)=='0') return 0;
else if(s.charAt(0)=='*') dp[1]=9;
else dp[1]=1;
for(int i=1;i<s.length();i++){
char ch=s.charAt(i);
char pre=s.charAt(i-1);
if(ch=='*'){
dp[i+1]=dp[i]*9%MOD;
if(pre=='1'){
dp[i+1]=(dp[i+1]+9*dp[i-1])%MOD;
}else if(pre=='2'){
dp[i+1]=(dp[i+1]+6*dp[i-1])%MOD;
}else if(pre=='*'){
dp[i+1]=(dp[i+1]+15*dp[i-1])%MOD;
}
}else{
if(ch!='0') dp[i+1]=dp[i];
if(pre=='*'){
if(ch>='0'&&ch<='6') dp[i+1]=(dp[i+1]+2*dp[i-1])%MOD;
else dp[i+1]=(dp[i+1]+dp[i-1])%MOD;
}else if(pre=='1'){
dp[i+1]=(dp[i+1]+dp[i-1])%MOD;
}else if(pre=='2'){
if(ch>='0'&&ch<='6') dp[i+1]=(dp[i+1]+dp[i-1])%MOD;
}
}
}
return (int)dp[dp.length-1];
}
}