數字字符串按 'A'→1, 'B'→2, ..., 'Z'→26 編碼。給定編碼字符串,求解碼方法總數。例:"12" → "AB"(1,2) 或 "L"(12),答案 2。
dp[i] 表示前 i 個字符的解碼數(1-based)。
s[i-1] != '0',dp[i] += dp[i-1]。i>=2 且 10 <= (s[i-2]-'0')*10 + (s[i-1]-'0') <= 26,dp[i] += dp[i-2]。dp[0]=1(空串 1 種),dp[1] 視首字符是否為 '0'。int numDecodings(string s) {
if (s.empty() || s[0]=='0') return 0;
int n = s.size(), pre = 1, cur = 1;
for (int i = 1; i < n; ++i) {
int tmp = cur;
if (s[i] == '0') cur = 0;
if (s[i-1]=='1' || (s[i-1]=='2' && s[i]<='6')) cur += pre;
pre = tmp;
if (cur == 0) return 0; // 提前終止
}
return cur;
}