LeetCode个人刷题笔记——面试题46.把数字翻译成字符串

动态规划题

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

审题+思路

刷题过程中,本菜鸡也遇到了好些动态规划的题目了,做起来总算也是有一点感觉了,列表行程里加上一个,以后抽空整理一下动态规划的思路和相关题目,请大家监督哈哈哈。

今天每日一题,翻译数字,题目的难点就在于,当相邻两个数字组合起来不超过25时,也可以被翻译成一种字母,这造成了翻译过程中的多样性。题目问,有多少种方案,dp题眼,360度旋转式暗示我们用dp。
OK,按照dp的常规结题来。一个数字,可以看成一串字符,以第i位结尾的数字的翻译方案可以获得如下dp方程

f(i)=f(i-1)+f(i-2)*judge

不难理解,当i与i-1位的两个数字组合超过25时,则i不可与i-1一起翻译,反之,需要加上f(i-2),judge就是这一判断的结果。设定dp[3]数组
边界值

dp[0]=0
dp[1]=1

有了dp方程,代码相信难不倒诸位大神了。 ^ _ ^

代码

class Solution {
public:
    int translateNum(int num) {
        int res=1;
        if(num<10)
            return res;
        
        vector<int> dp;
        dp.resize(3,0);
        dp[0]=1;dp[1]=1;
        string n=to_string(num);
        int l=n.size();
        for(int i=1;i<l;i++){
            int flag;
            string t=n.substr(i-1,2);
            if(t<="25" && t>="10"){
                dp[2]=dp[0]+dp[1];
            }
            else{
                dp[2]=dp[1];
            }
            dp[0]=dp[1];
            dp[1]=dp[2];
        }
        res=dp[2];

        return res;
    }
};

你可能感兴趣的:(LeetCode个人刷题笔记——面试题46.把数字翻译成字符串)