力扣 面试题46. 把数字翻译成字符串 dp

https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
在这里插入图片描述

思路:为了方便,我们把输入转换成一个字符串,并且下标从 1 1 1开始,用 d p [ i ] dp[i] dp[i]表示 s [ 1 … i ] s[1…i] s[1i]对应的数字有多少种不同的翻译方法。显然单个数字一定可以对应一种翻译方法,所以有 d p [ i ] + = d p [ i − 1 ] dp[i]+=dp[i-1] dp[i]+=dp[i1],如果是两个数字的话,我们需要计算然后判断它和 25 25 25的关系(注意特判掉前导 0 0 0的情况),如果也能对应一种翻译方法的话,就有 d p [ i ] + = d p [ i − 2 ] dp[i]+=dp[i-2] dp[i]+=dp[i2]。注意初始化要使得 d p [ 0 ] = d p [ 1 ] = 1 dp[0]=dp[1]=1 dp[0]=dp[1]=1

class Solution {
public:
    int getval(int i,string &s)
    {
        if(s[i-1]=='0')//不合题意
            return 30;
        return (s[i-1]-'0')*10+s[i]-'0';
    }
    int translateNum(int num) {
        stringstream ss;
        ss<<" "<<num;
        string s=ss.str();
        vector<int> dp(s.size());
        int len=s.size()-1;
        dp[0]=dp[1]=1;//一个数字一定可以翻译成一个字符
        for(int i=2;i<=len;i++)
        {
            dp[i]+=dp[i-1];//s[i]一个数字一定可以翻译成一个字符
            if(getval(i,s)<=25)//s[i-1]和s[i]可以翻译成一个字符
                dp[i]+=dp[i-2];
        }
        return dp[len];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值