Decode Ways II

题目
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'.

答案

class Solution {
    public int numDecodings(String s) {
        long[] dp = new long[s.length() + 1];
        long first, second;

        // Base case
        dp[s.length()] = 1;

        if(s.charAt(s.length() - 1) == '0')
            dp[s.length() - 1] = 0;
        else if(s.charAt(s.length() - 1) == '*')
            dp[s.length() - 1] = 9;
        else
            dp[s.length() - 1] = 1;


        for(int i = s.length() - 2; i >= 0; i--) {
            // Look at ith character

            if(s.charAt(i) == '*') {
                first = 9 * dp[i + 1];
            }
            else {
                int n = Integer.parseInt(s.substring(i, i+1));
                first = (n > 0) ? dp[i + 1] : 0;
            }
            if(s.charAt(i) == '*' && s.charAt(i+1) != '*') {
                if(s.charAt(i+1) <= '6') second = 2 * dp[i + 2];
                else second = dp[i + 2];
            }
            else if(s.charAt(i) != '*' && s.charAt(i+1) == '*') {
                if(s.charAt(i) == '0' || s.charAt(i) > '2') second = 0;
                else second = (s.charAt(i) == '1') ? 9 * dp[i + 2] : 6 * dp[i + 2];
            }
            else if(s.charAt(i) != '*' && s.charAt(i+1) != '*') {
                int n = Integer.parseInt(s.substring(i, i+2));
                second = (n > 0 && n <= 26 && s.charAt(i) != '0') ? second = dp[i + 2] : 0;
            }
            else {
                second = 15 * dp[i + 2];
            }

            dp[i] = (first + second) % 1000000007;
        }
        return (int)dp[0];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 难得闲暇的时光,约了朋友,本想去寻一街金黄,却忘了早已过了满地金黄的时节。总是在匆匆忙忙碌碌无为中,忘却了时光的流...
    菩提院落阅读 265评论 2 2
  • 女生越来越有“女王情结”:不是公主,不带一身公主病,不做王后,不拿婚姻当筹码。 生活中,绝大多数女生既无显赫出身、...
    洛洛莉ya阅读 7,412评论 122 299
  • 眼见着要到新一年 昨晚计划好今天早上七点起,送走朋友,上午收拾屋子,中午去找陈老大午餐,下午逛街,晚上看萨满十周年...
    sasa467阅读 242评论 0 0
  • 早上醒来,靠在床头,翻看公众号的文章,一篇《要么孤独,要么庸俗》的文章让我再次想起叔本华的《人生的智慧》。不由得又...
    燕麦文话阅读 1,611评论 7 25