給定一個只包含數字的非空字符串,根據映射規則 'A'→1, 'B'→2, ..., 'Z'→26,計算解碼方法總數。例如 "12" 可解碼為 "AB"(1,2) 或 "L"(12),共 2 種方式。
設 dp[i] 表示前 i 個字符的解碼方法數。遞推關係取決於第 i 個字符單獨解碼、或與前一字符組合解碼:
s[i-1] != '0',可單獨解碼:dp[i] += dp[i-1]10 <= s[i-2..i-1] <= 26,可組合解碼:dp[i] += dp[i-2]public int numDecodings(String s) {
int len = s.length();
if (len == 0) return 0;
int prev = 1; // dp[i-2]
int cur = s.charAt(0) > '0' ? 1 : 0; // dp[i-1]
if (cur == 0) return 0;
for (int i = 1; i < len; i++) {
int temp = cur;
int comp = Integer.parseInt(s.substring(i-1, i+1));
if (s.charAt(i) == '0') {
char c = s.charAt(i-1);
if (c == '1' || c == '2') {
cur = prev; // 必須組合解碼
prev = temp;
continue;
} else return 0; // 無效編碼
} else if (comp < 10 || comp > 26) {
prev = temp; // 只能單獨解碼
continue;
}
cur += prev; // 兩種情況均可
prev = temp;
}
return cur;
}