leetcode刷题笔记九十一题 解码方法

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) 。

/**
仔细分析,本题其实类似爬楼梯问题,也是动态规划的题目
根据前后两个字符,判断具体情况:
对于s.substring(i-1, i+1),即s(i-1)与s(i)
1.不为10、20,且小于等于26,认为这两个字符可以各自分开或合为一体
2.大于26,则这两个字符必须分开
3.等于10或者20的情况下,只能作为10或20
4.i位为0且i-1位大于2或等于0,返回0
*/
object Solution {
    def numDecodings(s: String): Int = {
        val length = s.length
        if(s(0) == '0') return 0

        var cur = 1
        var pre = 1
        for(i <- 1 to length-1){
            val temp = cur
            if(s(i) == '0'){
             //这种情况下s(i-1)与s(i)固定组成10或20 cur=pre
                if(s(i-1) == '1' || s(i-1) == '2')  cur = pre
                else return 0
            }
            else {
                if(s(i-1) == '1' ||(s(i-1) == '2' && s(i) >= '1' && s(i) <= '6'))  cur = cur + pre
            }
           	//如27这种不同于20,2并不能受7的影响,其可以与i-2位组成两位数,所以cur保持不变
            pre = temp
        }
        return cur
    }
}
posted @ 2020-07-29 20:09  ganshuoos  阅读(114)  评论(0编辑  收藏  举报