"2"...'Z'->"26"要解碼已編碼的訊息,所有數字必須基於上述映射的方法,反向映射回字母(可能有多種方法)。例如,"11106"可以對應為:"AAJF",將訊息分組為(11106)"KJ"/> "2"...'Z'->"26"要解碼已編碼的訊息,所有數字必須基於上述映射的方法,反向映射回字母(可能有多種方法)。例如,"11106"可以對應為:"AAJF",將訊息分組為(11106)"KJ">
一條包含字母A-Z 的訊息透過以下映射進行了編碼:
'A' -> "1"
'B' -> "2"
...
'Z' -> " 26"
要解碼已編碼的訊息,所有數字必須基於上述映射的方法,反向映射回字母(可能有多種方法)。例如,"11106" 可以對應為:
"AAJF" ,將訊息分組為(1 1 10 6)
"KJF" ,將訊息分組為(11 10 6)
注意,訊息不能分組為 (1 11 06) ,因為"06" 不能對應為"F" ,這是由於"6" 和"06" 在映射中並不等價。
給你一個只含數字的 非空 字串 s ,請計算並傳回 解碼 方法的 總數 。
題目資料保證答案肯定是一個 32 位元 的整數。
範例1:
輸入:s = "12"
輸出:2
解釋:它可以解碼為"AB"(1 2)或"L"(12)。
範例2:
輸入:s = "226"
輸出:3
解釋:它可以解碼為"BZ" (2 26), "VF" (22 6), 或"BBF" (2 2 6) 。
範例3:
輸入:s = "0"
輸出:0
#解釋:沒有字元對應到以0 開頭的數字。
含有 0 的有效對應是 'J' -> "10" 和 'T'-> "20" 。
由於沒有字符,因此沒有有效的方法對此進行解碼,因為所有數字都需要映射。
提示:
1 <= s.length <= 100
s 只包含數字,並且可能包含前導零。
對於給定的字串s ,設它的長度為n ,其中的字元從左到右依序為s[1],s [2],...,s[n]。我們可以使用動態規劃的方法來計算字串的解碼方法數。
具體地,設 fi表示字串s的前i個字元 s[1..i]的解碼方法數。在進行狀態轉移時,我們可以考慮最後一次解碼使用了s中的哪些字元
class Solution { public int numDecodings(String s) { int n = s.length(); int[] f = new int[n + 1]; f[0] = 1; for (int i = 1; i <= n; ++i) { if (s.charAt(i - 1) != '0') { f[i] += f[i - 1]; } if (i > 1 && s.charAt(i - 2) != '0' && ((s.charAt(i - 2) - '0') * 10 + (s.charAt(i - 1) - '0') <= 26)) { f[i] += f[i - 2]; } } return f[n]; } }
時間複雜度:o(n)
空間複雜度:o(n)
具體的方法思路請看上文表述,本方法對空間複雜度進行了優化,透過使用臨時變數的方式,使得空間複雜度從o(n)降為o(1)
func numDecodings(s string) int { n := len(s) // a = f[i-2], b = f[i-1], c = f[i] a, b, c := 0, 1, 0 for i := 1; i <= n; i++ { c = 0 if s[i-1] != '0' { c += b } if i > 1 && s[i-2] != '0' && ((s[i-2]-'0')*10+(s[i-1]-'0') <= 26) { c += a } a, b = b, c } return c }
時間複雜度:o(n)
空間複雜度:o(1)
以上是Go Java演算法之解碼方法實例程式碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!