最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(91.解碼方法)

 更新時間:2021年07月19日 10:40:58   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(91.解碼方法),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 91. Decode Ways 解碼方法

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).

Example 2:

Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

這道題要求解碼方法,跟之前那道 Climbing Stairs 非常的相似,但是還有一些其他的限制條件,比如說一位數(shù)時不能為0,兩位數(shù)不能大于 26,其十位上的數(shù)也不能為0,除去這些限制條件,跟爬梯子基本沒啥區(qū)別,也勉強(qiáng)算特殊的斐波那契數(shù)列,當(dāng)然需要用動態(tài)規(guī)劃 Dynamci Programming 來解。建立一維 dp 數(shù)組,其中 dp[i] 表示s中前i個字符組成的子串的解碼方法的個數(shù),長度比輸入數(shù)組長多多1,并將 dp[0] 初始化為1?,F(xiàn)在來找狀態(tài)轉(zhuǎn)移方程,dp[i] 的值跟之前的狀態(tài)有著千絲萬縷的聯(lián)系,就拿題目中的例子2來分析吧,當(dāng) i=1 時,對應(yīng)s中的字符是 s[0]='2',只有一種拆分方法,就是2,注意 s[0] 一定不能為0,這樣的話無法拆分。當(dāng) i=2 時,對應(yīng)s中的字符是 s[1]='2',由于 s[1] 不為0,那么其可以被單獨(dú)拆分出來,就可以在之前 dp[i-1] 的每種情況下都加上一個單獨(dú)的2,這樣 dp[i] 至少可以有跟 dp[i-1] 一樣多的拆分情況,接下來還要看其能否跟前一個數(shù)字拼起來,若拼起來的兩位數(shù)小于等于26,并且大于等于 10(因?yàn)閮晌粩?shù)的高位不能是0),那么就可以在之前 dp[i-2] 的每種情況下都加上這個二位數(shù),所以最終 dp[i] = dp[i-1] + dp[i-2],是不是發(fā)現(xiàn)跟斐波那契數(shù)列的性質(zhì)吻合了。所以0是個很特殊的存在,若當(dāng)前位置是0,則一定無法單獨(dú)拆分出來,即不能加上 dp[i-1],就只能看否跟前一個數(shù)字組成大于等于 10 且小于等于 26 的數(shù),能的話可以加上 dp[i-2],否則就只能保持為0了。具體的操作步驟是,在遍歷的過程中,對每個數(shù)字首先判斷其是否為0,若是則將 dp[i] 賦為0,若不是,賦上 dp[i-1] 的值,然后看數(shù)組前一位是否存在,如果存在且滿足前一位是1,或者和當(dāng)前位一起組成的兩位數(shù)不大于 26,則當(dāng)前 dp[i] 值加上 dp[i - 2]。最終返回 dp 數(shù)組的最后一個值即可,代碼如下:

C++ 解法一:

class Solution {
public:
    int numDecodings(string s) {
        if (s.empty() || s[0] == '0') return 0;
        vector<int> dp(s.size() + 1, 0);
        dp[0] = 1;
        for (int i = 1; i < dp.size(); ++i) {
            dp[i] = (s[i - 1] == '0') ? 0 : dp[i - 1];
            if (i > 1 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))) {
                dp[i] += dp[i - 2];
            }
        }
        return dp.back();
    }
};

Java 解法一:

class Solution {
    public int numDecodings(String s) {
        if (s.isEmpty() || s.charAt(0) == '0') return 0;
        int[] dp = new int[s.length() + 1];
        dp[0] = 1;
        for (int i = 1; i < dp.length; ++i) {
            dp[i] = (s.charAt(i - 1) == '0') ? 0 : dp[i - 1];
            if (i > 1 && (s.charAt(i - 2) == '1' || (s.charAt(i - 2) == '2' && s.charAt(i - 1) <= '6'))) {
                dp[i] += dp[i - 2];
            }
        }
        return dp[s.length()];
    }
}

下面這種方法跟上面的方法的思路一樣,只是寫法略有不同:

C++ 解法二:

class Solution {
public:
    int numDecodings(string s) {
        if (s.empty() || s[0] == '0') return 0;
        vector<int> dp(s.size() + 1, 0);
        dp[0] = 1;
        for (int i = 1; i < dp.size(); ++i) {
            if (s[i - 1] != '0') dp[i] += dp[i - 1];
            if (i >= 2 && s.substr(i - 2, 2) <= "26" && s.substr(i - 2, 2) >= "10") {
                dp[i] += dp[i - 2];
            }
        }
        return dp.back();
    }
};

Java  解法二:

class Solution {
    public int numDecodings(String s) {
        if (s.isEmpty() || s.charAt(0) == '0') return 0;
        int[] dp = new int[s.length() + 1];
        dp[0] = 1;
        for (int i = 1; i < dp.length; ++i) {
            if (s.charAt(i - 1) != '0') dp[i] += dp[i - 1];
            if (i >= 2 && (s.substring(i - 2, i).compareTo("10") >= 0 && s.substring(i - 2, i).compareTo("26") <= 0)) {
                dp[i] += dp[i - 2];
            }
        }
        return dp[s.length()];
    }
}

我們再來看一種空間復(fù)雜度為 O(1) 的解法,用兩個變量 a, b 來分別表示 s[i-1] 和 s[i-2] 的解碼方法,然后從 i=1 開始遍歷,也就是字符串的第二個字符,判斷如果當(dāng)前字符為 '0',說明當(dāng)前字符不能單獨(dú)拆分出來,只能和前一個字符一起,先將 a 賦為0,然后看前面的字符,如果前面的字符是1或者2時,就可以更新 a = a + b,然后 b = a - b,其實(shí) b 賦值為之前的 a,如果不滿足這些條件的話,那么 b = a,參見代碼如下:

C++ 解法三:

class Solution {
public:
    int numDecodings(string s) {
        if (s.empty() || s[0] == '0') return 0;
        int a = 1, b = 1, n = s.size();
        for (int i = 1; i < n; ++i) {
            if (s[i] == '0') a = 0;
            if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6')) {
                a = a + b;
                b = a - b;
            } else {
                b = a;
            }
        }
        return a;
    }
};

Java 解法三:

class Solution {
    public int numDecodings(String s) {
        if (s.isEmpty() || s.charAt(0) == '0') return 0;
        int a = 1, b = 1, n = s.length();
        for (int i = 1; i < n; ++i) {
            if (s.charAt(i) == '0') a = 0;
            if (s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) <= '6')) {
                a = a + b;
                b = a - b;
            } else {
                b = a;
            }
        }
        return a;
    }
}

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(91.解碼方法)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)解碼方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt模仿Windows文件夾縮略圖的三種實(shí)現(xiàn)方式

    Qt模仿Windows文件夾縮略圖的三種實(shí)現(xiàn)方式

    本文講的不是簡單的model/view或者widget的或者QML的基礎(chǔ)框架實(shí)現(xiàn),而是在這些框架之上的肉(文件夾縮略圖)的效果實(shí)現(xiàn),本文將以QWidget、Qt Quick(QML)、以及QGraph三種實(shí)現(xiàn)方式來講解,如何做出和Windows類似的縮略圖,需要的朋友可以參考下
    2024-04-04
  • C語言編程函數(shù)指針入門精講教程

    C語言編程函數(shù)指針入門精講教程

    大家在C語言的學(xué)習(xí)中一定會接觸指針這樣一個東西,而指針也是新手路上一定要消滅的boss,如果以后還要學(xué)習(xí)Java的同學(xué)更是要注重指針的學(xué)習(xí),希望能夠有所幫助
    2021-10-10
  • QT委托代理機(jī)制之Model?View?Delegate使用方法詳解

    QT委托代理機(jī)制之Model?View?Delegate使用方法詳解

    這篇文章主要介紹了QT委托代理機(jī)制之Model?View?Delegate的使用方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 示例詳解C++中的各種鎖

    示例詳解C++中的各種鎖

    C++中常見的鎖包括互斥鎖、遞歸互斥鎖、讀寫鎖、定時互斥鎖、遞歸定時互斥鎖、自旋鎖和條件變量,互斥鎖用于防止多線程同時訪問共享資源,遞歸互斥鎖允許同一線程多次獲取鎖,讀寫鎖區(qū)分讀寫操作,提高并發(fā)性
    2024-11-11
  • VC6.0常見編譯錯誤提示附解決方法

    VC6.0常見編譯錯誤提示附解決方法

    這篇文章主要介紹了VC++6.0編譯過程中常遇到的一些錯誤提示并給出了錯誤原因與分析,需要的朋友尅參考下
    2013-07-07
  • C語言每日練習(xí)之二叉堆

    C語言每日練習(xí)之二叉堆

    這篇文章主要為大家介紹了C語言二叉堆,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java C++ 算法leetcode828統(tǒng)計子串中唯一字符乘法原理

    Java C++ 算法leetcode828統(tǒng)計子串中唯一字符乘法原理

    這篇文章主要為大家介紹了Java C++ 算法leetcode828統(tǒng)計子串中唯一字符乘法原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • C++使用easyx畫實(shí)時走動的鐘表

    C++使用easyx畫實(shí)時走動的鐘表

    這篇文章主要為大家詳細(xì)介紹了C++使用easyx畫實(shí)時走動的鐘表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++基于QWidget和QLabel實(shí)現(xiàn)圖片縮放,拉伸與拖拽

    C++基于QWidget和QLabel實(shí)現(xiàn)圖片縮放,拉伸與拖拽

    這篇文章主要為大家詳細(xì)介紹了C++如何基于QWidget和QLabel實(shí)現(xiàn)圖片縮放、拉伸與拖拽等功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C語言中的浮點(diǎn)數(shù)據(jù)類型

    C語言中的浮點(diǎn)數(shù)據(jù)類型

    這篇文章主要介紹了C語言中的浮點(diǎn)數(shù)據(jù)類型,文章會從處理帶小數(shù)的數(shù)值的相關(guān)資料開始介紹,感興趣的小伙伴的可以參考下面 文章的具體內(nèi)容
    2021-10-10

最新評論

新乡市| 卢湾区| 离岛区| 岐山县| 托克托县| 阜阳市| 阜阳市| 衢州市| 陇南市| 日喀则市| 郎溪县| 阜康市| 丹棱县| 四子王旗| 沐川县| 东乌| 商洛市| 孟州市| 贵阳市| 吉木萨尔县| 巴林左旗| 东方市| 昭觉县| 平利县| 福海县| 澳门| 潜山县| 苍山县| 哈尔滨市| 朝阳县| 高雄市| 图片| 双牌县| 云和县| 治多县| 犍为县| 无锡市| 会理县| 鄂托克前旗| 彭阳县| 枝江市|