【ALGO】Leetcode 91.解码方法

题面

原题链接
一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26

给定一个只包含数字的非空字符串,请计算解码方法的总数。
题目数据保证答案肯定是一个 32 位的整数。

解析

使用动态规划算法求解,定义 f [ i ] f[i] f[i]表示由前 i i i个字符可以解码回去的字符串集合,考虑1位解码和两位解码的情况,转移方程为
f [ i ] = f [ i ] + f [ i − 1 ] f [ i ] = f [ i ] + f [ i − 2 ] if ( s [ i − 1 ] − ′ 0 ′ ) ∗ 10 + ( s [ i ] − ′ 0 ′ ) ∈ [ 10 , 26 ] f[i]=f[i]+f[i-1]\\ f[i]=f[i]+f[i-2] \quad \text{if} (s[i-1]-'0')*10+(s[i]-'0')\in[10, 26] f[i]=f[i]+f[i1]f[i]=f[i]+f[i2]if(s[i1]0)10+(s[i]0)[10,26]

AC代码

class Solution {
public:
    int numDecodings(string s) {
        int n=s.size();
        s = ' '+s;
        vector<int> f(n+1);
        f[0]=1;
        for(int i=1; i<=n; ++i){
            if(s[i]>='1' && s[i]<='9') f[i]+=f[i-1];
            if(i>1){
                int t=(s[i-1]-'0')*10+s[i]-'0';
                if(t>=10 && t<=26) f[i]+=f[i-2];
            }
        }
        return f[n];
    }
};
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页
实付 99.00元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值