牛客网:把数字翻译成字符串

转移方程分析如下,设f[n]字符串的前n位的最多可能编码结果。

对于字符串中的一个数字字符:

1.如果在是在字符[1,9],那么有一种方案就是单独将这个字符拿出,那么方案数是f[n-1]

2.如果这个字符和前面的字符能组成在字符串[10,26]之间的字符串,那么这也是一种方案,在这种方案下,我们需要将当前字符和前面的一个字符拿出,这种方案的方案数是f[n-2]

除了转移方程外我们仍然需要注意一些编程上的细节,第一个数时f[1]=1,第二个数如果产生了上面第二种情况,那么我们直接进行加一,因为减二的那个数不存在。

代码如下所示:

class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        vector<int> res(nums.size());
        int size=nums.size();
        for(int i=0;i<size;++i){
            if(i==0) res[i]=1;
            else{
                if(nums[i]>='1' && nums[i]<='9'){
                    res[i]+=res[i-1];
                }
                string tmp = nums.substr(i-1, 2);
                if(tmp>="10" && tmp<="26" && i>=2){
                    res[i]+=res[i-2];
                }
                if(tmp>="10" && tmp<="26" && i==1){
                    res[i]+=1;
                }
            }
        }
        return res[size-1];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值