国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

劍指offer(C++)-JZ46:把數(shù)字翻譯成字符串(算法-動態(tài)規(guī)劃)

這篇具有很好參考價值的文章主要介紹了劍指offer(C++)-JZ46:把數(shù)字翻譯成字符串(算法-動態(tài)規(guī)劃)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作者:翟天保Steven
版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處

劍指offer(C++)-JZ46:把數(shù)字翻譯成字符串(算法-動態(tài)規(guī)劃)

題目描述:

有一種將字母編碼成數(shù)字的方式:'a'->1, 'b->2', ... , 'z->26'。

現(xiàn)在給一串數(shù)字,返回有多少種可能的譯碼結(jié)果

數(shù)據(jù)范圍:字符串長度滿足 0<n≤90

進階:空間復雜度 O(n),時間復雜度O(n)

示例1:

輸入:

"12"

返回值:

2

說明:

2種可能的譯碼結(jié)果(”ab” 或”l”)

示例2:

輸入:

"31717126241541717"

返回值:

192

說明:

192種可能的譯碼結(jié)果

解題思路:

本題是動態(tài)規(guī)劃的經(jīng)典題目。有兩個解題思路,動態(tài)規(guī)劃和動態(tài)規(guī)劃進階(空間復雜度低)。

本題難點在于0的情況,10和20則只代表1種結(jié)果,11-19或21-26能代表2種結(jié)果,0不代表任何情況且可能會導致解碼失敗,1-9代表1種結(jié)果。

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

  1. 用長度比字符串長度多1的dp存儲結(jié)果數(shù)。dp[0]初始化為1;i從1開始,dp[i]存放的是前i個數(shù)字可能的結(jié)果,所以dp[1]也為1,dp[2]開始就要分情況了。
  2. 若i-1為0,則i-2必須為1或2,編碼才可能成功,10和20有字母,30及之后都沒有對應(yīng)字母了。那么有dp[i]等于dp[i-2],相當于dp[i]在dp[i-2]種可能的基礎(chǔ)上多了一個雙數(shù)字字母,多一個字母則結(jié)果數(shù)是一致的。
  3. 若i-2和i-1的位置能組合出11-19/21-26的數(shù),則dp[i]相當于dp[i-1]和dp[i-2]之和。dp[i-1]表示截止到前i-1個數(shù)字可能的結(jié)果數(shù),加上一個單數(shù)字對應(yīng)的字母,是一類情況;dp[i-2]表示截止到前i-2個數(shù)字可能的結(jié)果數(shù),加上一個雙數(shù)字對應(yīng)的字母,是一類情況。
  4. 若組合不出雙數(shù)字字母,那就只能是單數(shù)字字母了,所以dp[i]等于dp[i-1]。相當于dp[i]在dp[i-1]種可能的基礎(chǔ)上多了一個字母,多一個字母則結(jié)果數(shù)是一致的。
  5. 最后返回dp[size],size是字符串長度,就是size個字符可能的結(jié)果數(shù)。

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

? ? ? ?思路和思路一中基本一致。區(qū)別在于用pre和cur兩個int數(shù)動態(tài)刷新,來實現(xiàn)動態(tài)規(guī)劃,好處是空間復雜度降低,壞處是丟失了前面的結(jié)果數(shù)據(jù)只保留了最終結(jié)果。

? ? ? ?建議看懂思路一代碼再看思路二代碼。

測試代碼:

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

class Solution {
public:
    // 解碼
    int solve(string nums) {
        // 排除開頭為0的情況
        if(nums[0] == '0')
            return 0;
        // 動態(tài)規(guī)劃
        // dp[0]初始化為1;i從1開始,dp[i]存放的是前i個數(shù)字可能的結(jié)果,所以dp[1]也為1,dp[2]開始就要分情況了
        vector<int> dp(nums.size()+1, 1);
        for(int i = 2; i <= nums.size(); ++i){
            // 注意字符串下標是從0開始
            // 若i-1為0,則當i-2為1或2時,編碼才可能成功,10和20有字母,30及之后都沒有對應(yīng)字母了
            if(nums[i - 1] == '0'){
                // 若是10或20,則dp[i]等于dp[i-2],相當于dp[i]在dp[i-2]種可能的基礎(chǔ)上多了一個字母,多一個字母則結(jié)果數(shù)是一致的
                if(nums[i - 2] == '1' || nums[i - 2] == '2')
                    dp[i] = dp[i - 2];
                else 
                    return 0;
            }
            // 若i-2和i-1的位置能組合出11-19/21-26的數(shù),則dp[i]相當于dp[i-1]和dp[i-2]之和
            // dp[i-1]表示前i-1個數(shù)字可能的結(jié)果數(shù),加上一個單數(shù)字對應(yīng)的字母,是一類情況
            // dp[i-2]表示前i-2個數(shù)字可能的結(jié)果數(shù),加上一個雙數(shù)字對應(yīng)的字母,是一類情況
            else if(nums[i - 2] == '1' || (nums[i - 2] == '2' && nums[i - 1] > '0' && nums[i - 1] < '7')){
                dp[i] = dp[i - 1] + dp[i - 2];
            }
            // 若組合不出雙數(shù)字字母,那就只能是單數(shù)字字母了,所以dp[i]等于dp[i-1]
            // 相當于dp[i]在dp[i-1]種可能的基礎(chǔ)上多了一個字母,多一個字母則結(jié)果數(shù)是一致的
            else{
                dp[i] = dp[i - 1];
            }
        }
        return dp[nums.size()];
    }
};

思路二:動態(tài)規(guī)劃進階文章來源地址http://www.zghlxwxcb.cn/news/detail-465072.html


class Solution {
public:
    // 解碼
    int solve(string nums) {
        // 排除開頭為0的情況
        if(nums[0] == '0')
            return 0;
        // 動態(tài)規(guī)劃
        // 用pre表示前i-1個字符的可能數(shù),cur表示前i個字符的可能數(shù)
        vector<int> dp(nums.size()+1, 1);
        int pre = 1;
        int cur = 1;
        for(int i = 2; i <= nums.size(); ++i){
            // temp存儲cur,因為cur馬上要被覆蓋了
            int temp = cur;
            // 注意字符串下標是從0開始
            // 若i-1為0,則當i-2為1或2時,編碼才可能成功,10和20有字母,30及之后都沒有對應(yīng)字母了
            if(nums[i - 1] == '0'){
                // 若是10或20,則cur等于上一輪的pre,也就是比當前位置靠前2步的數(shù)值
                if(nums[i - 2] == '1' || nums[i - 2] == '2')
                    cur = pre;
                else 
                    return 0;
            }
            // 若i-2和i-1的位置能組合出11-19/21-26的數(shù),則cur等于上一輪的cur和pre之和
            // 上一輪的cur表示前i-1個數(shù)字可能的結(jié)果數(shù),加上一個單數(shù)字對應(yīng)的字母,是一類情況
            // 上一輪的pre表示前i-2個數(shù)字可能的結(jié)果數(shù),加上一個雙數(shù)字對應(yīng)的字母,是一類情況
            else if(nums[i - 2] == '1' || (nums[i - 2] == '2' && nums[i - 1] > '0' && nums[i - 1] < '7')){
                cur = cur + pre;
            }
            // 若組合不出雙數(shù)字字母,那就只能是單數(shù)字字母了,所以cur相比上一輪的cur無數(shù)值變化,這段代碼也可以刪除,為了便于分情況理解我加上了
            else{
                cur = cur;
            }
            // 這一輪的pre等于上一輪的cur
            pre = temp;
        }
        return cur;
    }
};

到了這里,關(guān)于劍指offer(C++)-JZ46:把數(shù)字翻譯成字符串(算法-動態(tài)規(guī)劃)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • LeetCode:劍指Offer 05. 替換空格 (字符串)

    LeetCode:劍指Offer 05. 替換空格 (字符串)

    ??道阻且長,行則將至。?? ??算法,不如說它是一種思考方式?? 算法專欄: ????123 上一題:344. 反轉(zhuǎn)字符串 本文速覽: ??劍指 Offer 05 . 替換空格 - 簡單 ??151. 反轉(zhuǎn)字符串中的單詞-中等 題目描述 :請實現(xiàn)一個函數(shù),把字符串 s 中的每個空格替換成\\\"%20\\\"。 來源:力扣(

    2023年04月11日
    瀏覽(21)
  • 劍指Offer--05替換空格&&58左旋字符串

    劍指Offer--05替換空格&&58左旋字符串

    題目是這樣的 意思是將字符串s中的空格替換為字符串\\\"%20\\\",如果只是替換一個字符還好,可以在原數(shù)組直接替換,但是是將空格替換為字符串,所以再在原數(shù)組上替換,原數(shù)組原內(nèi)容會被覆蓋,且長度大小不夠,所以此時要動態(tài)開辟一個字符數(shù)組,這個數(shù)組開多大?考慮最壞

    2024年02月06日
    瀏覽(22)
  • (字符串 ) 劍指 Offer 58 - II. 左旋轉(zhuǎn)字符串 ——【Leetcode每日一題】

    (字符串 ) 劍指 Offer 58 - II. 左旋轉(zhuǎn)字符串 ——【Leetcode每日一題】

    難度:簡單 字符串的左旋轉(zhuǎn)操作是把字符串前面的若干個字符轉(zhuǎn)移到字符串的尾部。請定義一個函數(shù)實現(xiàn)字符串左旋轉(zhuǎn)操作的功能。比如,輸入字符串\\\"abcdefg\\\"和數(shù)字2,該函數(shù)將返回左旋轉(zhuǎn)兩位得到的結(jié)果\\\"cdefgab\\\"。 示例 1: 輸入: s = “abcdefg”, k = 2 輸出: “cdefgab” 示例 2:

    2024年02月08日
    瀏覽(24)
  • 劍指 Offer 20. 表示數(shù)值的字符串 (正則 逐步分解)

    請實現(xiàn)一個函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。 數(shù)值(按順序)可以分成以下幾個部分: 若干空格 一個 小數(shù) 或者 整數(shù) (可選)一個 ‘e’ 或 ‘E’ ,后面跟著一個 整數(shù) 若干空格 小數(shù)(按順序)可以分成以下幾個部分: (可選)一個符號字符(‘+’

    2024年02月14日
    瀏覽(97)
  • LeetCode:劍指 Offer 58 - II. 左旋轉(zhuǎn)字符串

    LeetCode:劍指 Offer 58 - II. 左旋轉(zhuǎn)字符串

    ??道阻且長,行則將至。?? ??算法,不如說它是一種思考方式?? 算法專欄: ????123 題目描述 :字符串的左旋轉(zhuǎn)操作是把字符串前面的若干個字符轉(zhuǎn)移到字符串的尾部。請定義一個函數(shù)實現(xiàn)字符串左旋轉(zhuǎn)操作的功能。比如,輸入字符串\\\"abcdefg\\\"和數(shù)字2,該函數(shù)將返回左旋

    2024年02月02日
    瀏覽(24)
  • (字符串 ) 劍指 Offer 05. 替換空格 ——【Leetcode每日一題】

    (字符串 ) 劍指 Offer 05. 替換空格 ——【Leetcode每日一題】

    難度:簡單 請實現(xiàn)一個函數(shù),把字符串 s 中的每個 空格 替換成 “ %20 ”。 示例 1: 輸入:s = “We are happy.” 輸出:“We%20are%20happy.” 限制 : 0 = s 的長度 = 10000 ??思路:雙指針法 如果想把這道題目做到 極致 ,就不要只用額外的輔助空間了! 首先擴充數(shù)組到每個空格替換

    2024年02月08日
    瀏覽(30)
  • 劍指Offer48.最長不含重復字符的子字符串 C++

    請從字符串中找出一個最長的不包含重復字符的子字符串,計算該最長子字符串的長度。 示例 1 : 輸入: “abcabcbb” 輸出: 3 解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。 示例 2 : 輸入: “bbbbb” 輸出: 1 解釋: 因為無重復字符的最長子串是 “b”,所以其長度為

    2024年02月12日
    瀏覽(21)
  • 【算法第六天7.19】反轉(zhuǎn)字符串,反轉(zhuǎn)字符串||,劍指 Offer 05. 替換空格,反轉(zhuǎn)字符串的單詞, 左旋轉(zhuǎn)字符串

    ================================================ 思路 :以中間為分界線,左右兩個邊界交換字符,依次向里收縮 思路 : 首先:字符串轉(zhuǎn)化為字符數(shù)組 char[] res = s.toCharArray(); 最后:將數(shù)組再轉(zhuǎn)回字符串 return new String(res); 1、循環(huán)以2k為單位, 2、在這個2k長的數(shù)組中進行反轉(zhuǎn),需要有首

    2024年02月16日
    瀏覽(54)
  • Leetcode-每日一題【劍指 Offer 20. 表示數(shù)值的字符串】

    Leetcode-每日一題【劍指 Offer 20. 表示數(shù)值的字符串】

    ? 請實現(xiàn)一個函數(shù)用來判斷字符串是否表示 數(shù)值 (包括整數(shù)和小數(shù))。 數(shù)值 (按順序)可以分成以下幾個部分: 若干空格 一個? 小數(shù) ?或者? 整數(shù) (可選)一個? \\\'e\\\' ?或? \\\'E\\\' ?,后面跟著一個? 整數(shù) 若干空格 小數(shù) (按順序)可以分成以下幾個部分: (可選)一個符號

    2024年02月13日
    瀏覽(19)
  • 【LeetCode-中等】劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù)(詳解)

    【LeetCode-中等】劍指 Offer 67. 把字符串轉(zhuǎn)換成整數(shù)(詳解)

    寫一個函數(shù) StrToInt,實現(xiàn)把字符串轉(zhuǎn)換成整數(shù)這個功能。不能使用 atoi 或者其他類似的庫函數(shù)。 首先,該函數(shù)會根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。 當我們尋找到的第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續(xù)

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包