91. 解码方法(JS实现)

1 题目

一条包含字母 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) 。

2 思路

这道题思路主要是考察动态规划,设d[i]为以索引号i为结尾的字符串所解码的总数,总体可以分为三种情况:1.当前位为0时。2. 当前位和前一位无法形成有效数字。3.当前位和前一位可以形成有效数字

3代码

/**
 * @param {string} s
 * @return {number}
 */
var numDecodings = function(s) {
  if (s.length === 0 || s[0] === '0') return 0;
  if (s.length === 1) return 1;

  const d = [1];

  for (let i=1; i<s.length; i++) {
    if (s[i] === '0') {       // 当前位为0
        if (s[i-1] !== '1' && s[i-1] !== '2') {    //无法连接前一位形成有效数字,返回0
            return 0;
        } else {          //d[i-2]
            d[i] = i > 1 ? d[i-2] : 1;
        }
    } else if (s[i-1] === '0' || parseInt(s[i-1])*10 + parseInt(s[i]) > 26) {   //前一位为0或当前位无法连接前一位
        d[i] = d[i - 1];
    } else {   //当前位可以连接前一位
        d[i] = d[i - 1] + (i > 1 ? d[i - 2] : 1);
    }
  }

  return d[s.length - 1];
};

你可能感兴趣的:(剑指offer)