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