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'.
解题思路:思路很简单,主要是分类情况比较多,要考虑的全面一些。
dp[i]定义为前i个字符解码的可能性。
if(s[i-1] == "*)
将这个字符单独解码有9种可能,共有9 * dp[i - 1] ;
将这个字符与前一个字符合并解码:
如果是 "**" , 共有15 * dp[i - 2] ;
如果是 "1*" ,共有 9 * dp[i - 2] ;
如果是 "2*" , 共有 6 * dp[i - 2] ;
else
将这个字符单独解码,如果这个字符非0 , 共有dp[i - 1] ;
将这个字符与前一个字符合并解码:
如果是 "*n"(n代表数字) ,
如果(0<=n<=6) 共有2 * dp[i - 2 ]
else 共有 dp[i - 2]
如果是"nn" , 10<=stoi("nn")<=26 , 共有dp[i - 1];
如果是"00" , 直接返回0 ;
class Solution {
public:
int numDecodings(string s)
{
int len = s.size() ;
vector<long> dp(len + 1 , 0) ;
if(len == 0) return 1 ;
int mod = 1000000007 ;
dp[0] = 1 ;
if(s[0] == '*') dp[1] = 9 ;
else if(s[0] != '0') dp[1] = 1 ;
else dp[1] = 0 ;
for(int i = 2 ; i <= len ; ++i)
{
if(s[i - 1] == '*')
{
dp[i] = (dp[i] + (9 * dp[i - 1]) % mod) % mod ;
if(s[i - 2] == '*') dp[i] = (dp[i] + (15 * dp[i - 2]) % mod) % mod;
else if(s[i - 2] == '1') dp[i] = (dp[i] + (9 * dp[i - 2]) % mod) % mod ;
else if(s[i - 2] == '2') dp[i] = (dp[i] + (6 * dp[i - 2]) % mod ) % mod ;
}
else
{
if(s[i-1] != '0') dp[i] = (dp[i] + dp[i - 1]) % mod ;
if(s[i - 2] == '*')
{
if(s[i - 1] >= '0' && s[i - 1] <= '6') dp[i] = (dp[i] + (2 * dp[i - 2]) % mod ) % mod ;
else dp[i] = (dp[i] + dp[i - 2]) % mod ;
}
else
{
int tmp = stoi(s.substr(i - 2 , 2)) ;
if(tmp >= 10 && tmp <= 26) dp[i] = (dp[i] + dp[i - 2]) % mod ;
else if(tmp == 0) return 0 ;
}
}
}
return dp[len] ;
}
};