91. Decode Ways 動態規劃-極客學院

極客學院-動態規劃字符串解碼沒有考慮 ‘0’的問題。1010 只有一種解碼方式。極客學院的課程動態規劃一,思路是四中解碼方式ios

int Deco_num(string& str)
{
    vector<int> vec(str.size(),1);
    if (str.size()<2) {
        return 1;
    }
    if (str[0] == '1' || (str[0] == '2' && str[1] <= '6')) {
        vec[1] =2;
    }
    
    int i;
    int tmp;
    for(i = 2;i<str.size();i++)
    {
        if (str[i]>='0' && str[i] <='9')
            vec[i] = vec[i-1];
        else
            return 0;
        
        tmp = str[i-1] - '0';
        tmp = tmp*10 + (str[i]- '0');
        
        if (str[i-1] != '0' && tmp <=26) {
            vec[i] += vec[i-2];
        }
    }
    return vec[str.size() - 1];
}

九章算法算法

//
//  main.cpp
//  strcode
//
//  Created by pengfei on 2/11/17.
//  Copyright © 2017 pengfei. All rights reserved.
//

#include <iostream>
#include <string>
#include <vector>

using namespace std;
/*
 這是一個典型的dp問題,假設定義一個數組,dp[i]爲到第i個字符所能組成的全部編碼方式的個數。那麼對於dp[i+1]來講,確定至少和dp[i] 同樣多,、
 若是第i個字符和i+1個字符能夠合成一個字符那麼dp[i+1] += dp[i-1]
 */

int toInt(char c){
    return c - '0';
}

int numDecodings(string& s) {
    // Write your code here
    if (s.size() == 0)
        return 0;
    else if (s.size() == 1)
        return s[0] != '0' ? 1 : 0;
    
    int* dp = new int[s.size()];
    dp[0] = s[0] != '0' ? 1 : 0;
    dp[1] = (s[0] != '0' && s[1] != '0'? 1 : 0) +
    ((s[0] != '0' && (toInt(s[0]) * 10 + toInt(s[1])) <= 26) ? 1 : 0);
    
    for (int i = 2; i < s.size(); ++i) {
        dp[i] = 0;
        if(s[i] != '0')
            dp[i] += dp[i-1];
        if(s[i-1] != '0' && (toInt(s[i-1]) * 10 + toInt(s[i])) <= 26){
            dp[i] += dp[i-2];
        }
    }
    
    return dp[s.size() - 1];
}


int main(int argc, const char * argv[]) {
    // insert code here...
    string str("1010");
    cout<<numDecodings(str)<<endl;
    std::cout << "Hello, World!\n";
    return 0;
}

解題思路:數組

前兩項主要是作好約束限制,求得前兩項的解碼的規律。編碼

循環中執行動態規劃的方程。spa

dp[i] 爲到第 i 個字符所能組成的編碼方式的個數,對於dp[i]來講,至少等於 dp[i-1],若第 i-1 和字符和 i個字符能夠合成一個字符 dp [i] = dp[i-1] + dp[i-2], 即 dp[i] += dp[i-2]。code

執行動態方程的同時還要加以其餘約束,若是前一位 和 0 組成一個字符 ,則必須組成,解碼數目不發生改變。字符串

相關文章
相關標籤/搜索