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
}
}