leetcode--91--递归与动态规划

题目链接: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];
}

 

posted on 2017-04-18 17:35  王雪皓  阅读(172)  评论(0编辑  收藏  举报