题目链接:https://leetcode.com/problems/decode-ways/#/description
第一种解法:递归,超时。。
var numDecodings = function(s) { if(!s || s.match('00') || /^0/.test(s)){ return 0; }else { return getNum(s); } }; function getNum(s){ if(/^0/.test(s)){ return 0; }else if(s < 11){ return 1; }else if(s <27){ if(s%10 === 0) return 1; else return 2; }else if(s < 100){ if(s%10 === 0) return 0; else return 1; }else { var headNum = s.substr(0,2); if(/^0/.test(headNum) || (headNum%10 === 0 && headNum>26)){ return 0; }else if(headNum < 27){ return getNum(s.substr(2)) + getNum(s.substr(1)); }else{ return getNum(s.substr(1)); } } }
第二种:动态规划,通过
function numDecodings(s){ if(!s || s.match('00') || /^0/.test(s)) return 0; var dp = [1]; dp[1] = s.charAt(0) == '0' ? 0 : 1; for(var i = 2; i <= s.length; i++){ dp[i] = 0; // 如果字符串的第i-1位和第i位能组成一个10到26的数字,说明我们可以在第i-2位的解码方法上继续解码 if(s.substring(i-2, i) <= 26 && s.substring(i-2, i) >= 10){ dp[i] += dp[i - 2]; } if(s.substring(i-1, i) != '0'){ dp[i] += dp[i - 1]; } } return dp[s.length]; }