LeetCode 91. Decode Ways
阿新 • • 發佈:2018-08-28
由於 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