【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]
};

 

posted @ 2018-04-03 10:06  seyjs  阅读(162)  评论(0编辑  收藏  举报