字串轉int_劍指 Offer 46. 把數字翻譯成字串 leetcode 劍指offer系列
阿新 • • 發佈:2021-01-05
技術標籤:字串轉int
點選專輯上方“藍字”關注我吧題目難度: 中等
原題連結[1]
今天繼續更新劍指 offer 系列, 老樣子晚上 6 點 45 分準時更新公眾號 每日精選演算法題, 大家記得關注哦~ 另外在公眾號裡回覆 offer 就能看到劍指 offer 系列當前連載的所有文章了
題目描述
給定一個數字,我們按照如下規則把它翻譯為字串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請程式設計實現一個函式,用來計算一個數字有多少種不同的翻譯方法。
- 0 <= num < 2^31
題目樣例
示例 1
輸入
12258
輸出
5
解釋
12258 有 5 種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
題目思考
- 根據數字的不同, 可能有不同方案, 例如當前是 2, 可能是單獨 1 個 2, 也可能是和前面數字組成的 12 和 22
- 利用這個發現, 你想到了什麼思路?
解決方案
思路
- 根據題目描述, 它很像一道動態規劃經典題: 70. 爬樓梯[2], 也是 1 個數字可以有多種方案
- 不同的是這裡可以組成兩位數的數字是有限制的, 不能像爬樓梯那樣無腦相加
- 所以我們可以定義 dp 陣列, dp[i]表示從左到右遍歷到第 i 位數字時可以翻譯成的字串數目
- 固定第 i 位數字後, 觀察其前一位數字, 可以得到如下轉移方程:
- 如果當前數字和前一位數字(如果存在的話)組成的兩位數在 10 到 25 之間, 那麼當前數字既可以獨立使用, 也可以和之前數字合用, 所以
dp[i] = dp[i-2](使用2個字元 "i] = dp[i-2") + dp[i-1](使用1個字元 "i-1")
- 如果當前數字無法和前一位數字組成有效的兩位數, 意味著當前數字只能獨立使用, 所以
dp[i] = dp[i-1]
- 如果當前數字和前一位數字(如果存在的話)組成的兩位數在 10 到 25 之間, 那麼當前數字既可以獨立使用, 也可以和之前數字合用, 所以
- 觀察上述方程, 我們發現整個 dp 陣列只用到了 i-2 和 i-1, 所以我們可以只使用兩個變數, 定義上一個和當前的 dp 值, 這樣既節省了空間, 又精簡了程式碼
- 注意需要先把輸入的數字轉換成字串, 方便每一位的處理
- 注意初始化值都為 1, 因為至少可以轉換成 1 個字串
- 這裡提供兩種程式碼實現方案: 一種使用 dp 陣列, 更好理解; 一種進行了空間優化, 更簡潔
複雜度
- 時間複雜度 O(M): M 是數字的位數, 只需要遍歷一遍數字的每一位即可
- 空間複雜度 O(1): 只使用了幾個變數
程式碼
方案 1 - 未使用空間優化
classSolution:
deftranslateNum(self,num:int)->int:
#dp,dp[i]表示第i位字元結尾時的翻譯方法數
#如果10<=int(s[i-1:i+1])<=25:dp[i]=dp[i-2](使用2個字元)+dp[i-1](使用1個字元)
#否則:dp[i]=dp[i-1](因為只能將當前字元單獨翻譯)
#先將數字轉字串
s=str(num)
dp=[0]*len(s)
#第0位肯定只有1種方案
dp[0]=1
foriinrange(1,len(s)):
#如果當前字元和前一個字元組成的數字介於10和25之間,說明可以合起來使用
if10<=int(s[i-1:i+1])<=25:
ifi==1:
#此時i-2不在範圍內,有2種方案可選
dp[i]=2
else:
dp[i]=dp[i-1]+dp[i-2]
else:
dp[i]=dp[i-1]
returndp[-1]
方案 2: 空間優化, 4 行程式碼
classSolution:
deftranslateNum(self,num:int)->int:
#初始化前兩個dp值為1,表示空字元和1個字元的情況,都只有1種方案
s,pre,cur=str(num),1,1
foriinrange(1,len(s)):
#將s[i-1]和s[i]組成的字串視為整體,判斷其值能否位於10和25之間,能的話就是前面兩個的值的和,否則就只能等於前一個的值了
#注意等式右邊的pre和cur分別等價於dp[i-2]和dp[i-1]
#而等式左邊的pre和cur則是dp[i-1]和dp[i]
#這裡利用python的同時賦值操作,不需要臨時變數儲存舊的cur
pre,cur=cur,((pre+cur)if10<=int(s[i-1:i+1])<=25elsecur)
returncur
參考資料
[1]原題連結: https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
[2]70. 爬樓梯: https://leetcode-cn.com/problems/climbing-stairs/
你的每個贊和在看,我都喜歡!