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 组成一个字符 ,则必须组成,解码数目不发生改变。字符串

相关文章
相关标签/搜索