【leetcode】Decode Ways
题目如下:
解题思路:这个题目的本质是一个爬楼梯问题,在爬楼梯问题中,每次可以选择走一步或者两步。而本题也是一样的,解码的时候选择解码一个字符或者两个字符,但是加大了一点点难度,要考虑这些情况。1,Z对应的编码是26,所以超过26的连续两个字符不能合并解码,27只能解析成2和7;2,0字符只能和前面的字符合并解码,不能单独作为一个字符解码。
代码如下:
/** * @param {string} s * @return {number} */ var numDecodings = function(s) { if(s.length == 0 || parseInt(s) == 0 || s[0] == '0' || s.indexOf('00') != -1){ return 0 } var ds = "" for(var i =0 ;i<s.length-1;i++){ if(s[i] == 0){ continue } if(s[i+1] != 0){ ds += s[i] } else if(s[i] <='2'){ ds += "A" } else{ return 0 } } if(s[s.length-1] != '0') ds += s[s.length-1] var dp = new Array(ds.length) dp[0] = 1 if(ds[0] <='2' && ds[0] > '0' && ds[1] !='A'){ if(ds[0] == 2 && ds[1] >='7'){ dp[1] = 1 } else{ dp[1] = 2 } } else{ dp[1] = 1 } for(var i = 2;i<ds.length;i++) { if (ds[i] == 'A') { dp[i] = dp[i - 1] continue } if (ds[i - 1] <= '2' && ds[i - 1] > 0 ) { if(ds[i-1] == '2' && ds[i] > '6'){ dp[i] = dp[i - 1] } else{ dp[i] = dp[i - 1] + dp[i - 2] } } else { dp[i] = dp[i - 1] } } //console.log(dp) return dp[ds.length-1] };