1. 程式人生 > >LeetCode 91. Decode Ways

LeetCode 91. Decode Ways

由於 lee ++ mea 本質 限制 num bin 很多

這道題本質上和 Climbing Stairs 那道DP題是一樣的,但是由於 decode 有範圍限制,所以寫起來有很多條件。

dp[i] 表示到下標為i為止的字符能得到的解碼個數

dp[i] += dp[i-1]   if s[i]!=‘0‘

   += dp[i-2]  if s[i-1:i+1] in "10"~"26" i>=2

dp[s.size()-1] 為答案

上述思路沒問題,但是考慮到 dp[1] 寫起來很復雜,如果把空字符串當成是一種解碼方式的話,dp[1] 就和別的大於1的數一樣了。但是數組沒法 -1 作為下標,所以只好所有下標往後順延,dp[0] = 1 表示空字符串,dp[1] 表示第一個字符構成的解碼數。dp[i] 的 i 表示第i個字符,對應到s裏應該是s[i-1],小心別寫錯就行。

由於只依賴前兩個dp,所以可以用兩個變量來代替,使得空間復雜度變為O(1)。

class Solution {
public:
    int numDecodings(string s) {
        // dp[i] means the num of ways of first i characters in s
        // dp[i] += dp[i-1] if s[i]!=‘0‘
        //       += dp[i-2] if s[i-1:i+1] in "10"~"26" 
        // dp[s.size()] is the ans.
        
        
        if
(s.empty()) return 0; vector<int> dp(s.size()+1,0); dp[0] = 1; // empty case dp[1] = s[0]==0?0:1; for (int i=2;i<=s.size();++i){ if (s[i-1]!=0) dp[i]+=dp[i-1]; if (i>=2 && (s[i-2]==1 || s[i-2]==2&& s[i-1]<=
6)) dp[i]+=dp[i-2]; } return dp[s.size()]; } };

LeetCode 91. Decode Ways