劍指 Offer把數字翻譯成字串

2021-10-10 23:13:57 字數 1451 閱讀 1488

給定乙個數字,我們按照如下規則把它翻譯為字串:0 翻譯成 「a」 ,1 翻譯成 「b」,……,11 翻譯成 「l」,……,25 翻譯成 「z」。

乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。

示例 1:

輸入: 12258

輸出: 5

解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

記數字 num 第 i 位數字為 xi ,數字 num 的位數為 n ;例如: num=12258 的 n=5 , x1 =1 。(我們認為nums[0]是第一位);

狀態定義: 設動態規劃列表 dp,dp[i]代表以xi為結尾的數字的翻譯方案數量。

轉移方程: 若 xi和xi−1組成的兩位數字可以被翻譯,則dp[i]=dp[i−1]+dp[i−2] ;否則 dp[i]=dp[i−1] 。

始狀態: dp[0] = dp[1] = 1 ,即 「無數字」 和 「第 1 位數字」 的翻譯方法數量均為 1;

返回值: dp[n] ,即此數字的翻譯方案數量。

q: 無數字情況 dp[0]=1 從何而來?

a: 當 num第 1, 2位的組成的數字∈[10,25] 時,顯然應有 2 種翻譯方法,即 dp[2] = dp[1] + dp[0] = 2,而顯然 dp[1] = 1,因此推出 dp[0] = 1 。

class

solution

return a;

}}

此題的動態規劃計算是 對稱的 ,即 從左向右 遍歷(從第 dp[2] 計算至 dp[n])和 從右向左 遍歷(從第 dp[n−2] 計算至 dp[0])所得方案數一致。從右向左遍歷的**如下所示。

class

solution

return a;

}}

上述方法雖然已經節省了 dp 列表的空間占用,但字串 s 仍使用了 o(n) 大小的額外空間。

空間複雜度優化:

利用求餘運算 num%10 和求整運算 num//10 ,可獲取數字 num 的各位數字(獲取順序為個位、十位、百位…)。

因此,可通過 求餘 和 求整 運算實現 從右向左 的遍歷計算。而根據上述動態規劃 「對稱性」 ,可知從右向左的計算是正確的。

自此,字串 s 的空間占用也被省去,空間複雜度從 o(n) 降至 o(1)。

class

solution

return a;

}}

劍指offer 把數字翻譯成字串(c

題目描述 給定乙個數字,按照如下規則翻譯成字串 0翻譯成 a 1翻譯成 b 25翻譯成 z 乙個數字有多種翻譯可能,例如12258一共有5種,分別是bccfi,bwfi,bczi,mcfi,mzi。實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。思路動態規劃,從最小的問題開始 f r 表示以r...

劍指 把數字翻譯成字串

1,題目 2,思路 動態規劃 dp i xi 屬於 10,25 dp i 1 10x xi 屬於 1,10 並上 25,99 方法一 字串遍歷 動態規劃 從左向右遍歷 方法二 字串遍歷 動態規劃 從左向右遍歷 此題的動態規劃計算是 對稱的 即 從左向右遍歷 從第 dp 2 計算至 dp n 和 從右...

劍指offer 046把數字翻譯成字串

題目 給定乙個數字,我們按照如下規則把它翻譯為字串 0翻譯成 a 1翻譯成 b 11翻譯成 l 大寫l 25翻譯為 z 乙個數字可能有多少個翻譯。例如,12258有5種不同的翻譯,分別是 bccfi bwfi bczi mcfi mzi 這道題目的解法是動態規劃 class solution def...