題目描述:數字字串('A'=1, ..., 'Z'=26),計算有多少種解碼方式。
解題思路:定義 dp[i] 為 s[0..i-1] 的解碼方式數。若 s[i-1] != '0',可以單獨解碼該字元,dp[i] += dp[i-1]。若 s[i-2..i-1] 組成的兩位數在 10-26 之間,可以組合解碼,dp[i] += dp[i-2]。處理前導 0 是此題的難點。
時間複雜度:O(n) — 單次線性掃描。
空間複雜度:O(n) — 可優化為 O(1) 只保留前兩個狀態。
1. If s[0] == '0': return 0 2. dp[0] = 1, dp[1] = 1 3. For i from 2 to n: a. oneDigit = s[i-1] as integer b. twoDigit = s[i-2..i-1] as integer c. If oneDigit >= 1: dp[i] += dp[i-1] d. If 10 <= twoDigit <= 26: dp[i] += dp[i-2] 4. Return dp[n]
遞迴無記憶 O(2^n) 最壞:嘗試各種分割,重複計算。
字符計數優化 O(n):計算各字符頻率,利用模式加速 — 邏輯不同但複雜度未必更優。