上下文
这个问题是dailycodingproblem和leetcode问的
/* 给定映射 a = 1, b = 2, ... z = 26 和编码消息,计算可以解码的方式数。
例如,消息“111”将给出 3,因为它可以被解码为“aaa”、“ka”和“ak”。
您可以假设消息是可解码的。例如,不允许使用“001”。*/
var AlphabetCode = function(){};
AlphabetCode.prototype.decode = function(message) {
//dp is optimal substructure, account for zero length string such as dp[0]
let dp = Array(1+message.length).fill(0);
//string is of length zero
dp[0] = 0; // no ways to decode empty (tried toggling between 0 and 1)
//string is of length one
dp[1] = parseInt(message[0]) == 0 ? 0 : 1; // there is no alphabet code for 0, 'a' starts at 1
//string is of length two or greater
// go up to string length inclusive because index 0 is reserved for zero string
for (let i = 2; i <= message.length; i++){
let singleDigit = message.substring(i-1, i);
let doubleDigit = message.substring(i-2, i);
//console.log(singleDigit + ' ' + doubleDigit);
//console.log(singleDigit[0]);
if (1 <= parseInt(singleDigit) <= 9){
dp[i] += dp[i-1];
//console.log(dp[i]);
}
//console.log(doubleDigit[0]);
if (doubleDigit[0] !='0' && 10 <= parseInt(doubleDigit) <= 26){
//console.log('double valid');
dp[i] += dp[i-2];
}
}
// filled out the dp array and returning the accumulation of all subproblems
return dp[message.length];
};
combinations = new AlphabetCode();
console.log('Number of ways to decode 10 are: (expect 1) ' + combinations.decode('10'));
console.log('Number of ways to decode 12 are: (expect 2) ' + combinations.decode('12'));
console.log('Number of ways to decode 226 are: (expect 3) ' + combinations.decode('226'));
console.log('Number of ways to decode 27 are: (expect 1) ' + combinations.decode('27'));
输出
Number of ways to decode 10 are: (expect 1) 1
Number of ways to decode 12 are: (expect 2) 1
Number of ways to decode 226 are: (expect 3) 2
Number of ways to decode 27 are: (expect 1) 1
dp
是最优子结构。尝试更改dp[0]
为 0 或 1 以通过所有测试用例,但输出并不总是等于预期的数字。