Question: How many possible results are there to convert the number string s into a letter?
DP (I): number of possible results for S [0... I-1. We set Si = I-1
Analyze s [Si]:
1. s [Si-1] = '1' | s [Si-1] = '2' & S [Si] = '6'
S [0... si] can be converted into letters corresponding to s [Si] + s [0... si-1] corresponding letter, may also be s [Si-1 .. si] corresponding letter + s [0... si-2] corresponding letters
That is, dp (I) = dp (I-1) + dp (I-2)
2. s [Si] = '0', which is easy to ignore.
2.1 s [Si-1] = '1' | s [Si-1] = '2'
S [0... Si] can be converted to s [Si-1... Si] corresponding letter + s [0... Si-2] corresponding letter
DP (I) = dp (I-2)
2.2 s [Si-1] does not exist or is another number
DP (I) = 0;
3. Other cases
DP (I) = dp (I-1)
The Code is as follows:
int numDecodings(string s) { vector<int> dp(s.size() + 1); dp[0] = 1; int i = 1; for (; i <= s.size(); i++) { int si = i - 1; if (s[si] == '0') { if (si - 1 >= 0 && (s[si - 1] == '1' || s[si - 1] == '2')) dp[i] = dp[i - 2]; else dp[i] = 0; } else if (si - 1 >= 0 && s[si - 1] == '1' || s[si - 1] == '2' && s[si] <= '6') dp[i] = dp[i - 1] + dp[i - 2]; else dp[i] = dp[i - 1]; } return s.size() == 0 ? 0 : dp[s.size()]; }
Decode ways [leetcode] DP