题解 | #把数字翻译成字符串#

把数字翻译成字符串

https://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 解码
 * @param nums string字符串 数字串
 * @return int整型
 */
function solve( nums ) {
    // dp[i]表示前i个数有dp[i]种编码方法
    // 如果当前数字编码方式是单个字符编码,则dp[i] = dp[i - 1],即前i - 1个数字的所有编码方式后面直接加上该字符即可,因此编码方法数跟i - 1的编码方法数一样,是同一种编码方式
    // 如果当前数字编码方式是单个字符编码或跟前面的1或2结合编码,则还应该加上dp[i - 2],即dp[i] = dp[i - 1] + dp[i - 2],意思是,前 i-2 个数字的所有解码方式加上这两个字符的组合解码即可
    // 字符串中所有数字都必须参与编码,因此出现第一个数为0的情况就是无效的
    if(nums.length === 0 || nums[0] == 0) return 0;
    const dp = new Array(nums.length + 1).fill(0);
    dp[0] = 1;
    dp[1] = 1;
    for(let i = 2; i <= nums.length; i++){
        // 只要当前位置不为0,就可以进行单个字符编码
        // 注意:索引i从2开始 当前的字符索引是i - 1
        if(nums[i - 1] !== '0'){
            dp[i] += dp[i - 1];
        }
        // 判断当前字符是否可以和前一个字符进行组合编码,如果可以dp[i]再加上dp[i - 2]
        const twoDigit = parseInt(nums[i - 2] + nums[i - 1]);
        if (twoDigit >= 10 && twoDigit <= 26) {
            dp[i] += dp[i - 2];
        }
    }
    return dp[nums.length];
}
module.exports = {
    solve : solve
};

全部评论

相关推荐

05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务