美文网首页
639. Decode Ways II

639. Decode Ways II

作者: yxwithu | 来源:发表于2017-09-11 12:20 被阅读0次

题目

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

分析

这一题是Decode Ways的升级版,在0-9的基础上增加了*表示可以替换成1-9之间的任意一个字符。这题也是用动态规划

e0 = current number of ways we could decode, ending on any number;
e1 = current number of ways we could decode, ending on an open 1;
e2 = current number of ways we could decode, ending on an open 2

设置e0,e1,e2分别表示到上一个数为止,以任意数(0-9)、1、2结尾的可能数是多少。
设置f0,f1,f2表示对应的这一轮的可能数
具体分析见代码

代码

    Say we see some character c. We want to calculate f0, f1, f2, the corresponding versions of e0, e1, e2 after parsing character c.

If c == '*', then the number of ways to finish in total is: we could put * as a single digit number (9*e0), or we could pair * as a 2 digit number 1* in 9*e1 ways, or we could pair * as a 2 digit number 2* in 6*e2 ways. The number of ways to finish with an open 1 (or 2) is just e0.

If c != '*', then the number of ways to finish in total is: we could put c as a single digit if it is not zero ((c>'0')*e0), or we could pair c with our open 1, or we could pair c with our open 2 if it is 6 or less ((c<='6')*e2). The number of ways to finish with an open 1 (or 2) is e0 iff c == '1' (or c == '2').
public int numDecodings(String s) {
    if(s.length() == 0) return 0;
    int mod = 1000000007;
    long e0 = 1, e1 = 0, e2 = 0;
    long f0 = 0, f1 = 0, f2 =0;
    
    for(char c : s.toCharArray()){
        if(c == '*'){
            f0 = 9 * e0 + 9 * e1 + 6 * e2;   
            f1 = e0;
            f2 = e0;
        }else{
            f0 = (c > '0' ? e0 : 0) + e1 + (c <= '6' ? e2 : 0);
            f1 = c == '1' ? e0 : 0;
            f2 = c == '2' ? e0 : 0;
        }
        e0 = f0 % mod;
        e1 = f1;
        e2 = f2;
    }
    
    return (int)e0;
}

相关文章

网友评论

      本文标题:639. Decode Ways II

      本文链接:https://www.haomeiwen.com/subject/zyaxsxtx.html