列表

详情


BM69. 把数字翻译成字符串

描述

有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。
我们把一个字符串编码成一串数字,再考虑逆向编译成字符串。
由于没有分隔符,数字编码成字母可能有多种编译结果,例如 11 既可以看做是两个 'a' 也可以看做是一个 'k' 。但 10 只可能是 'j' ,因为 0 不能编译成任何结果。
现在给一串数字,返回有多少种可能的译码结果

数据范围:字符串长度满足
进阶:空间复杂度 ,时间复杂度

示例1

输入:

"12"

输出:

2

说明:

2种可能的译码结果(”ab” 或”l”)

示例2

输入:

"31717126241541717"

输出:

192

说明:

192种可能的译码结果

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2020-12-24

class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        // write code here
        int len = nums.size();
        int *dp = new int[len+1];
        if (nums[0] > '0')
        {
            dp[1] = 1;
        }
        
        
        dp[0] = 1;
        for(int i = 1; i<len; i++)
        {
            int t1 = nums[i-1] - '0';
            int t2 = nums[i] - '0';
            int temp = t1*10+t2;
            if (t2 == 0)
            {
                if (temp>=10&&temp<=26)
                {
                    dp[i+1] = dp[i];
                }
                
            }
            else
            {
                if (temp>=10&& temp<=26)
                {
                    dp[i+1] = dp[i-1]+dp[i];
                }
                else
                {
                    dp[i+1] = dp[i];
                }
            }
        }
        
        return dp[len];
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 336KB, 提交时间: 2021-06-08

class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        // write code here
        //if(nums.size()==1)return 1;
        long long dp[nums.size()];
        dp[0]=1;
        if(nums[0]=='0')return 0;
        if(nums[0]=='1'&&nums[1]>'0'||nums[0]=='2'&&nums[1]<='6'&&nums[1]>='1')dp[1]=2;
        else dp[1]=dp[0];
        for(size_t i=2;i<nums.size();i++){
            
            if(nums[i]>'0'&&nums[i-1]=='1'||nums[i]>'0'&&nums[i]<='6'&&nums[i-1]=='2'){
                dp[i]=dp[i-1]+dp[i-2];
            }
            else if(nums[i]=='0'&&nums[i-1]=='1'||nums[i-1]=='2')dp[i]=dp[i-1];
            else if(nums[i]=='0')return 0;
            else dp[i]=dp[i-1];
        }
        return dp[nums.size()-1];
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 336KB, 提交时间: 2020-12-20

class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        // write code here
        int len = nums.size();
        if(len == 0) return 0;
        if(nums[0] == '0') return 0;
        vector<int> dp(len+1, 1);
        dp[1] = 1;
        for(int i=1; i<len; i++) {
            string temp = "";
            if(nums[i] == '0' && nums[i-1] == '0') {    //100
                return 0;
            }
            if(nums[i] == '0') {
                dp[i+1] = dp[i];
            }
            else if(nums[i-1] == '1' || (nums[i-1] == '2' && nums[i] <= '6')) {
                dp[i+1] = dp[i] + dp[i-1];
            }
            else {
                dp[i+1] = dp[i];
            }
        }
        return dp[len];
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2021-05-23

class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        // write code here
        if(!nums.length()||nums[0]=='0')
            return 0;
        int nums_len=nums.length();
        vector<int> dp(nums_len,0);
        dp[0]=1;
        for(int i=1;i<nums_len;i++){
            if(nums[i]!='0')
                dp[i]=dp[i-1];
            int num=(nums[i-1]-'0')*10+(nums[i]-'0');
            if(num<=26&&num>=10){
                if(i==1)
                    dp[i]++;
                else
                    dp[i]+=dp[i-2];
            }
        }
        return dp[nums_len-1];
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2021-05-13

class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        // write code here
        if(nums.empty()||nums=="0") return 0;
        int n=nums.size();
        vector<int> dp(n+1,0);
        dp[0]=1;
        for(int i=1;i<n;++i)
        {
            if(nums[i]=='0')
            {    
                if(nums[i-1]=='1'||nums[i-1]=='2')//10,20
                {
                    if(i==1) dp[i]=1;
                    else dp[i]=dp[i-2];
                }
            }
            else if((nums[i]>='1'&&nums[i]<='6'&&nums[i-1]=='2')||nums[i-1]=='1')//11-19,21-26
            {
                if(i==1) dp[i]=2;
                else dp[i]=dp[i-2]+dp[i-1];
            }
            else//0[1-9],>=27
                dp[i]=dp[i-1];
        }
        return dp[n-1];
    }
};

上一题