包含 A-Z
的字母的消息通过以下规则编码:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
给定一个包含数字的编码消息,请确定解码方法的总数。
例如,
给定消息为 "12"
, 它可以解码为 "AB"
(1 2)或 "L"
(12)。
"12"
的解码方法为 2 种。
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
个人思路:
只有1-26的数字可以转换为字母,从而才会有两种解读方式;0则无法解读,则解读方式为0;大于26则只可以分别解读,即只有一种方式。将每一个数字都作为最后一个要解读的数字,由最右向左依次解读。如果数字为0则到达该位置的方式数为0;如果数字为1-26,则为前两位的方式数之和;如果大于26,则等于前一位的方式数。
代码(JavaScript):
/**
* @param {string} s
* @return {number}
*/
var numDecodings = function(s) {
var length=s.length;
if(length==0||parseInt(s.charAt(0))==0){
return 0;
}
var ways=new Array(length+1);
ways[length]=1;
if(parseInt(s.charAt(length-1))!=0){
ways[length-1]=1;
}
else{
ways[length-1]=0;
}
for(var i=length-2;i>=0;i--){
if(parseInt(s.charAt(i))==0){
ways[i]=0;
continue;
}
else if(parseInt(s.substring(i,i+2))<=26){
ways[i]=ways[i+1]+ways[i+2];
}
else{
ways[i]=ways[i+1];
}
}
return ways[0];
};