极客学院-动态规划字符串解码没有考虑 ‘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 组成一个字符 ,则必须组成,解码数目不发生改变。字符串