【ALGO】Leetcode 91.解碼方法

minuxAE發表於2020-10-20

題面

原題連結
一條包含字母 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];
    }
};

相關文章