LeetCode-91.解码方法

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:

输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-ways
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

1、注意0 这个特殊值

2、倒序看待这个问题

通过研究规律得出如下结论

dp[i] 为i位置上的解码个数

如果nums[i] = 0,则dp[i] = 0

如果nums[i] + nums[i+1] >26 则 dp[i] = dp[i+1]

如果nums[i] + nums[i+1] <=26 则 dp[i] = dp[i+1] + dp[i+2]

代码:

public int numDecodings2(String s) {
    int result = 0;
    //默认为倒数第一
    int next= 1;

    if (s.charAt(s.length() - 1) != '0') {
        result = 1;
    }
    for (int i = s.length()-2; i >=0 ; i--) {
        // 0 开头 dp[i] = 0
        if (s.charAt(i) == '0') {
            next = result;
            result = 0;
            continue;
        }
        // nums[i] + nums[i+1] <= 26
        if ((s.charAt(i)-48)*10 + s.charAt(i+1)-48 <= 26) {
            result = result + next;
            next = result - next;
        } else {
            next = result;
        }
    }
    return result;
}
发布了328 篇原创文章 · 获赞 23 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/103883841