一条包含字母 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) 。
解题思路:感觉不太好描述,直接看代码吧。。。。。
Java代码:
public int numDecodings(String s) {
int len = s.length();
int[] decodecCnt = new int[len];
for(int i = 0; i < len; i++){
if(0 == i){
//第一位,return 0
if('0' == s.charAt(i))
return 0;
decodecCnt[i] = 1;
continue;
}
//当前位为0,但是前一位大于2或者为0,即当前位的0无法组成10/20的情况,无法解码,return 0
if('0' == s.charAt(i) && ('2' < s.charAt(i-1) || '0' == s.charAt(i-1)))
return 0;
if(1 == i){
decodecCnt[i] = '0' == s.charAt(i) ? 1 :
(('1' == s.charAt(i-1) || ('2' == s.charAt(i-1) && '6' >= s.charAt(i))) ? 2 : 1);
continue;
}
/**
* 若当前位为0,则必须与前一位组成为10/20解码,decodecCnt[i] = decodecCnt[i-2]
* 否则,若前一位为0,则当前位只能单独解码,decodecCnt[i] = decodecCnt[i-1]
* 否则,判断当前位和前一位是否小于等于26,若不满足,即当前位只能单独解码,decodecCnt[i] = decodecCnt[i-1]
* 若满足,即当前既可单独解码,又可与前一位组合解码,decodecCnt[i] = decodecCnt[i-2] + decodecCnt[i-1]
*
* */
decodecCnt[i] = '0' == s.charAt(i) ? decodecCnt[i-2] : ('0' == s.charAt(i-1) ? decodecCnt[i-1] :
(('1' == s.charAt(i-1) || ('2' == s.charAt(i-1) && '6' >= s.charAt(i))) ?
decodecCnt[i-2] + decodecCnt[i-1] : decodecCnt[i-1]));
}
return decodecCnt[len-1];
}