LeetCode 面試題46. 把數(shù)字翻譯成字符串 | Python

面試題46. 把數(shù)字翻譯成字符串


題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof

題目


給定一個數(shù)字,我們按照如下規(guī)則把它翻譯為字符串:0 翻譯成 “a” 麻敌,1 翻譯成 “b”愧驱,……芹血,11 翻譯成 “l(fā)”吕粹,……懂更,25 翻譯成 “z”碴卧。一個數(shù)字可能有多個翻譯。請編程實現(xiàn)一個函數(shù)鄙陡,用來計算一個數(shù)字有多少種不同的翻譯方法。

示例 1:

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

提示:

  • 0 <= num < 231

解題思路


思路:動態(tài)規(guī)劃

先理清題意柔吼,題目中說明規(guī)則: 0 翻譯成 "a", 1 翻譯成 "b"丙唧,...,25 翻譯成 "z"觅玻。而且題目中也說明【一個數(shù)字可能有多個翻譯】想际。那么這里就可以想到,當數(shù)字大于等于 10 小于等于 25 的時候溪厘,這部分的數(shù)字可以看出是兩個單獨數(shù)字組成胡本,或者單獨當成一個數(shù)字。

現(xiàn)在看示例 1:

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

看下面的解釋中侧甫,我們可以看到:

  • "bccfi" 這種情況就是將所有的數(shù)字單獨翻譯,即是 [1, 2 ,2, 5, 8]
  • 剩下的 4 個就是連續(xù)兩位數(shù)字可考慮組合的情況
    • [1, 22, 5, 8] 對應翻譯的是 "bwfi"
    • [1, 2, 25, 8] 對應翻譯的是 "bczi"
    • [12, 2, 5, 8] 對應翻譯的是 "mcfi"
    • [12, 25, 8] 對應翻譯的是 "mzi"

在上面的示例中蹋宦,'58' 這個組合是不成立的披粟,我們知道組合的數(shù)字的范圍應該落在 [10, 25] 之間。

那么也就是說冷冗,翻譯的規(guī)則守屉,在字符串的第 i 個位置中可以分為兩種情況:

  • 單獨進行翻譯
  • 如果與 i - 1 位能夠組合成數(shù)字且落在 [10, 25],那么可以連起來翻譯蒿辙。

現(xiàn)在假設(shè)將題目給出的數(shù)字 num 第 i 個數(shù)字記為 x_i拇泛,例如示例中的 num = 12258,那么 x_1 就是 1思灌。

現(xiàn)在定義動態(tài)規(guī)劃列表 dp俺叭,假設(shè) dp[i] 為 x_i 結(jié)尾的數(shù)字的翻譯方案。

按照前面得出的翻譯規(guī)則總結(jié)出轉(zhuǎn)移方程泰偿。

x_{i-1}x_i 兩個數(shù)字組合可被翻譯時熄守,這里就會有兩種情況。單獨翻譯甜奄,或者組合翻譯柠横。也就是:

  • 當組合翻譯的時候,x_{i-1}x_i 組合確定课兄,前面 i-2 個數(shù)的翻譯方案為 dp[i-2]牍氛。
  • 當單獨翻譯的時候,x_i 確定烟阐,前面 i-1 個數(shù)的翻譯方案為 dp[i-1]搬俊。
  • 也就是說當 x_{i-1}x_i 兩個數(shù)字組合可被翻譯的時候紊扬,可由上述兩種情況結(jié)合,最終 dp[i] = dp[i-2] + dp[i-1]唉擂。

如果 x_{i-1}x_i 兩個數(shù)字無法組合餐屎,那么就只能當成單個數(shù)字進行翻譯。所以 dp[i] = dp[i-1]玩祟。

這里需要注意的可組合數(shù)字落在的區(qū)間是 [10, 25]腹缩,前面已經(jīng)說明了,只有這種情況才能夠成功組合被翻譯空扎。

還有一種情況藏鹊,就是 x_{i-1} 為 0 的時候,這種情況可以會出現(xiàn) 00, 01, 02, ... 這樣的組合數(shù)字转锈。但是這種情況是不能夠被翻譯的盘寡。

所以最終的狀態(tài)轉(zhuǎn)移方程,以及具體落在的區(qū)間:

dp[i] = \begin{cases} dp[i-2] + dp[i-1]撮慨, & 10x_{i-1} + x_i \in [10, 25] \\ dp[i-1] & 10x_{i-1} + x_i \in [0, 10) \bigcup (25, 99] \end{cases}

注意竿痰,這里我們并不考慮三位數(shù)的組合

在這里,dp[i] 表示的是以 x_i 結(jié)尾的數(shù)字的翻譯方案砌溺。當 i=0 和 i=1 的時候影涉,表示的是【無數(shù)字】和【第一個數(shù)字】。這里都初始化為 1抚吠。(前面說明了 x_1 表示的是第 1 個數(shù)字常潮,如題目 12258 中的第一個數(shù)字 1。)

反向推導 dp[0] 的值楷力,假設(shè)當出現(xiàn)兩個數(shù)字能夠組合且被翻譯的情況下喊式,例如 12,那么 dp[2] 顯然是等于 2萧朝。要么以 [1, 2] 的形式岔留,要么以 [12] 的形式進行翻譯。
此時 dp[2] = dp[1] + dp[0] = 2检柬,而 dp[1] 為 1献联,那么 dp[0] = 1。

而最終我們需要求得的結(jié)果就是 dp[n]何址,也就是題目中所需求的翻譯方案(n 表示的是數(shù)字長度里逆。)

在這里可以使用字符串截取的方法去實現(xiàn),這里需要將數(shù)字下轉(zhuǎn)換為字符串用爪,缺點是字符串會占用一定的空間原押。這里采用字符串截取的方法來求解。還有一種方法是使用取模的方法(可考慮嘗試)

具體的代碼如下偎血。

代碼實現(xiàn)


class Solution:
    def translateNum(self, num: int) -> int:
        string = str(num)
        n = len(string)

        dp = [0] * (n+1)
        
        dp[0]=1
        dp[1]=1

        for i in range(2, n + 1):
            if "10" <= string[i-2:i] <="25":
                dp[i] = dp[i-1] + dp[i-2]
            else:
                dp[i] = dp[i-1]
        
        return dp[n]

實現(xiàn)結(jié)果


實現(xiàn)結(jié)果

總結(jié)


  • 本題使用的動態(tài)規(guī)劃诸衔,先分析題意盯漂,找出翻譯的規(guī)則”颗可以發(fā)現(xiàn)就缆,當?shù)?i 個數(shù)字被翻譯的時候,可能出現(xiàn)兩種情況:
    • 單獨翻譯第 i 個位置的數(shù)字
    • 當?shù)?i 個位置的數(shù)字與第 i-1 位置的數(shù)字組合且可被翻譯谒亦,那么可考慮組合進行翻譯
  • 根據(jù)上面的翻譯規(guī)則竭宰,可以求得轉(zhuǎn)移方程(具體參考上面的解析):
    • 當兩個連續(xù)數(shù)字能夠組合的情況下:dp[i] = dp[i-2]+dp[i-1]
    • 否則:dp[i]=dp[i-1]
  • 對動態(tài)規(guī)劃列表進行初始化,確定最終求解的值為 dp[n]诊霹。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羞延,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脾还,更是在濱河造成了極大的恐慌,老刑警劉巖入愧,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鄙漏,死亡現(xiàn)場離奇詭異,居然都是意外死亡棺蛛,警方通過查閱死者的電腦和手機怔蚌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旁赊,“玉大人桦踊,你說我怎么就攤上這事≈粘” “怎么了籍胯?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長离福。 經(jīng)常有香客問我杖狼,道長,這世上最難降的妖魔是什么妖爷? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任蝶涩,我火速辦了婚禮,結(jié)果婚禮上絮识,老公的妹妹穿的比我還像新娘绿聘。我一直安慰自己,他們只是感情好次舌,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布熄攘。 她就那樣靜靜地躺著,像睡著了一般垃它。 火紅的嫁衣襯著肌膚如雪鲜屏。 梳的紋絲不亂的頭發(fā)上烹看,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音洛史,去河邊找鬼惯殊。 笑死,一個胖子當著我的面吹牛也殖,可吹牛的內(nèi)容都是我干的土思。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼忆嗜,長吁一口氣:“原來是場噩夢啊……” “哼己儒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捆毫,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闪湾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绩卤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體途样,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年濒憋,在試婚紗的時候發(fā)現(xiàn)自己被綠了何暇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡凛驮,死狀恐怖裆站,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黔夭,我是刑警寧澤宏胯,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站纠修,受9級特大地震影響胳嘲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扣草,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一了牛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辰妙,春花似錦鹰祸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尔破,卻和暖如春街图,著一層夾襖步出監(jiān)牢的瞬間浇衬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工餐济, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耘擂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓絮姆,卻偏偏與公主長得像醉冤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篙悯,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359