• Leetcode 面试题46. 把数字翻译成字符串


    地址 https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/

    给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
    
     
    
    示例 1:
    
    输入: 12258
    输出: 5
    解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi""mzi"
     

    解答

    首先使用暴力解法

    每次检测当前元素作为单独数字处理

    ans += dfs(numv, idx + 1);

    还要继续检测当前元素和上一个元素是否可以组成10~25之间 那么

    ans += dfs(numv, idx + 2);

    class Solution {
    public:
        
        
    int dfs(const vector<int>& numv, int idx)
    {
        if (idx >= numv.size()) return 1;
    
        int ans = 0;
        if (idx + 1 < numv.size() && 
            ( 
                (numv[idx] == 1)  || (numv[idx] == 2 && (numv[idx+1] >= 0 && numv[idx+1] <= 5))  
            )
            )
        {
            ans += dfs(numv, idx + 2);
        }
        ans += dfs(numv, idx + 1);
    
        return ans;
    }
    
    int translateNum(int num) {
        vector<int> numv;
        while (num != 0) {
            int t = num % 10;
            numv.push_back(t);
            num = num / 10;
        }
        reverse(numv.begin(), numv.end());
    
        int ret = dfs(numv, 0);
    
        return ret;
    }
        
    };

    第二种办法是使用动态规划

    dp[i]表示当前1~i的数字 能转换字母的方案数

    dp[i] = dp[i-1]+dp[i-2] (如果符合能组成10~25的情况 则有dp[i-2])

    class Solution {
    public:
       
        int dp[50];
    int translateNum(int num) {
        vector<int> v;
        while (num != 0) {
            int t = num % 10;
            v.push_back(t);
            num = num / 10;
        }
        reverse(v.begin(), v.end());
        dp[0] = 1;
        for (int i = 0; i < v.size(); i++)
        {
            int idx = i + 1;
            dp[idx] += dp[idx - 1];
            if (i > 0) {
                if (v[i - 1] == 1 ||
                    (v[i - 1] == 2 && v[i] >= 0 && v[i] <= 5))
                {
                    dp[idx] += dp[idx - 2];
                }
            }
        }
    
        return dp[v.size()];
    }
        
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    c++
    zjoi 力
    poj 3415
    [SDOI2014]旅行
    模板测试
    [WC2006]水管局长
    HDU5730
    [NOI2014]魔法森林
    [NOI2012]骑行川藏(未完成)
    [NOI2012]随机数生成器
  • 原文地址:https://www.cnblogs.com/itdef/p/13072363.html
Copyright © 2020-2023  润新知