Go Java算法之解碼方法示例詳解
解碼方法
一條包含字母 A-Z 的消息通過以下映射進行了 編碼 :
- 'A' -> "1"
- 'B' -> "2"
- ...
- 'Z' -> "26"
要 解碼 已編碼的消息,所有數(shù)字必須基于上述映射的方法,反向映射回字母(可能有多種方法)。例如,"11106" 可以映射為:
"AAJF" ,將消息分組為 (1 1 10 6)
"KJF" ,將消息分組為 (11 10 6)
注意,消息不能分組為 (1 11 06) ,因為 "06" 不能映射為 "F" ,這是由于 "6" 和 "06" 在映射中并不等價。
給你一個只含數(shù)字的 非空 字符串 s ,請計算并返回 解碼 方法的 總數(shù) 。
題目數(shù)據(jù)保證答案肯定是一個 32 位 的整數(shù)。
- 示例 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 開頭的數(shù)字。
含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。
由于沒有字符,因此沒有有效的方法對此進行解碼,因為所有數(shù)字都需要映射。
提示:
1 <= s.length <= 100
s 只包含數(shù)字,并且可能包含前導零。
方法一:動態(tài)規(guī)劃(Java)
對于給定的字符串 s ,設它的長度為 n ,其中的字符從左到右依次為 s[1],s[2],...,s[n]。我們可以使用動態(tài)規(guī)劃的方法計算出字符串的解碼方法數(shù)。
具體地,設 fi表示字符串s的前i個字符 s[1..i]的解碼方法數(shù)。在進行狀態(tài)轉(zhuǎn)移時,我們可以考慮最后一次解碼使用了 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)
方法二:動態(tài)規(guī)劃——優(yōu)化(go)
具體的方法思路請看上文表述,本方法對空間復雜度進行了優(yōu)化,通過使用臨時變量的方式,使得空間復雜度從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算法之解碼方法示例詳解的詳細內(nèi)容,更多關于Go Java算法解碼的資料請關注腳本之家其它相關文章!
相關文章
Java中的CopyOnWriteArrayList深入解讀
這篇文章主要介紹了Java中的CopyOnWriteArrayList深入解讀,在 ArrayList 的類注釋上,JDK 就提醒了我們,如果要把 ArrayList 作為共享變量的話,是線程不安全的,需要的朋友可以參考下2023-12-12SpringBoot統(tǒng)一返回處理出現(xiàn)cannot?be?cast?to?java.lang.String異常解決
這篇文章主要給大家介紹了關于SpringBoot統(tǒng)一返回處理出現(xiàn)cannot?be?cast?to?java.lang.String異常解決的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-09-09JAVA中string數(shù)據(jù)類型轉(zhuǎn)換詳解
在JAVA中string是final類,提供字符串不可以修改,string類型在項目中經(jīng)常使用,下面給大家介紹了string七種數(shù)據(jù)類型轉(zhuǎn)換,需要的朋友可以參考下2015-07-07RabbitMq中channel接口的幾種常用參數(shù)詳解
這篇文章主要介紹了RabbitMq中channel接口的幾種常用參數(shù)詳解,RabbitMQ 不會為未確認的消息設置過期時間,它判斷此消息是否需要重新投遞給消費者的唯一依據(jù)是消費該消息的消費者連接是否己經(jīng)斷開,需要的朋友可以參考下2023-08-08spring boot高并發(fā)下耗時操作的實現(xiàn)方法
這篇文章主要給大家介紹了關于spring boot高并發(fā)下耗時操作的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-11-11