極客學院-動態規劃字符串解碼沒有考慮 ‘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 組成一個字符 ,則必須組成,解碼數目不發生改變。字符串