摘要:最新更新請見動態(tài)規(guī)劃復(fù)雜度時間空間思路解碼是有規(guī)律的,所以我們可以嘗試動態(tài)規(guī)劃。如果字符串的第位和第位不能組成有效二位數(shù)字,而且第位不是的話,說明我們是在第位的解碼方法上繼續(xù)解碼。
Decode Ways 最新更新請見:https://yanjia.me/zh/2019/02/...
動態(tài)規(guī)劃 復(fù)雜度A message containing letters from A-Z is being encoded to numbers using the following mapping:
"A" -> 1 "B" -> 2 ... "Z" -> 26Given an encoded message containing digits, determine the total number of ways to decode it.
For example, Given encoded message "12", it could be decoded as "AB"
(1 2) or "L" (12).The number of ways decoding "12" is 2.
時間 O(N) 空間 O(N)
思路解碼是有規(guī)律的,所以我們可以嘗試動態(tài)規(guī)劃。假設(shè)數(shù)組dp[i]表示從頭到字符串的第i位,一共有多少種解碼方法的話,那么如果字符串的第i-1位和第i位能組成一個10到26的數(shù)字,說明我們是在第i-2位的解碼方法上繼續(xù)解碼。如果字符串的第i-1位和第i位不能組成有效二位數(shù)字,而且第i位不是0的話,說明我們是在第i-1位的解碼方法上繼續(xù)解碼。所以,如果兩個條件都符合,則dp[i]=dp[i-1]+dp[i-2],否則dp[i]=dp[i-1]。
注意如果出現(xiàn)無法被兩位數(shù)接納的0,則無法解碼,我們可以在一開始就判斷,并將其初始化為0,這樣后面的相加永遠(yuǎn)都是加0
代碼public class Solution { public int numDecodings(String s) { if(s.length() == 0) return s.length(); int[] dp = new int[s.length() + 1]; // 初始化第一種解碼方式 dp[0] = 1; // 如果第一位是0,則無法解碼 dp[1] = s.charAt(0) == "0" ? 0 : 1; for(int i = 2; i <= s.length(); i++){ // 如果字符串的第i-1位和第i位能組成一個10到26的數(shù)字,說明我們可以在第i-2位的解碼方法上繼續(xù)解碼 if(Integer.parseInt(s.substring(i-2, i)) <= 26 && Integer.parseInt(s.substring(i-2, i)) >= 10){ dp[i] += dp[i - 2]; } // 如果字符串的第i-1位和第i位不能組成有效二位數(shù)字,在第i-1位的解碼方法上繼續(xù)解碼 if(Integer.parseInt(s.substring(i-1, i)) != 0){ dp[i] += dp[i - 1]; } } return dp[s.length()]; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64607.html
摘要:用將子字符串轉(zhuǎn)化為,參見和的區(qū)別然后用動規(guī)方法表示字符串的前位到包含方法的個數(shù)。最后返回對應(yīng)字符串末位的動規(guī)結(jié)果。 Problem A message containing letters from A-Z is being encoded to numbers using the following mapping: A -> 1 B -> 2 ... Z -> 26 Given ...
摘要:經(jīng)總結(jié),發(fā)現(xiàn)當(dāng)前字符前面的兩個字符和一個字符可以拿出來進(jìn)行分析。當(dāng)前的數(shù)目可以作為和的數(shù)目的疊加。所以關(guān)系式是其他的特殊情況可以進(jìn)行特殊處理。需要注意的是如果錢兩位是,,則這兩位作廢,不能計入其他情況的統(tǒng)計,即。 描述 A message containing letters from A-Z is being encoded to numbersusing the following...
摘要:記錄長度法復(fù)雜度時間空間思路本題難點(diǎn)在于如何在合并后的字符串中,區(qū)分出原來的每一個子串。這里我采取的編碼方式,是將每個子串的長度先賦在前面,然后用一個隔開長度和子串本身。這樣我們先讀出長度,就知道該讀取多少個字符作為子串了。 Encode and Decode Strings Design an algorithm to encode a list of strings to a s...
摘要:用棧暫存的邏輯與遞歸基本一致,可以理解為用遞歸實現(xiàn)棧。沒有棧這種數(shù)據(jù)結(jié)構(gòu),可以用數(shù)組或雙端隊列可以只用一個棧以元組的形式重復(fù)次數(shù)和字符串,如利用棧初始化數(shù)據(jù)結(jié)構(gòu)遞歸字符串入棧刷新計算重復(fù)次數(shù)可直接操作字符串真的很方便。 題目: 給定一個經(jīng)過編碼的字符串,返回它解碼后的字符串。Given an encoded string, return its decoded string. 編碼規(guī)則...
摘要:利用棧我們可以存儲外圍層已持有的字符串以及應(yīng)當(dāng)展開的次數(shù)。用棧的思路來寫要求思路更加嚴(yán)謹(jǐn),以免出現(xiàn)邏輯錯誤。這里需要額外注意的是,如果當(dāng)前該括號外圍存在父元素,則我們應(yīng)當(dāng)將父元素的計數(shù)和已有字符串壓入棧中。 題目要求 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_...
閱讀 2808·2023-04-25 18:06
閱讀 2605·2021-11-22 09:34
閱讀 1697·2021-11-08 13:16
閱讀 1323·2021-09-24 09:47
閱讀 3060·2019-08-30 15:44
閱讀 2784·2019-08-29 17:24
閱讀 2597·2019-08-23 18:37
閱讀 2446·2019-08-23 16:55