A message containing letters from A-Z
is being encoded to numbers using the
following mapping:
‘A‘ -> 1 ‘B‘ -> 2 ... ‘Z‘ -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1
2) or "L"
(12).
The number of ways decoding "12"
is 2.
class Solution { public: int numDecodings(string s) { int n = s.size(); if(0 == n) { return 0; } vector<int> record(s.size() + 1, -1); // 记录已经保存的结果 return numDecodingsByDP(s, record); } int numDecodingsByDP(string s, vector<int>& record) { /** * 采用动态规划解 * record:作为记录表 * 状态转移方程: * f(n) = tag1 * f(n - 1) + tag2 * f(n - 2); * tag1 = c(n) == '0'? 0:1; * tag2 = <n,n-1> can be decoded? 1: 0; * 初始状态: * f(0) = 1; f(1) = 1; **/ int n = s.size(); int tmpR = record.at(n); if(tmpR >= 0) { return tmpR; } if(n == 1) { tmpR = s.at(0) == '0'? 0:1; record.at(n) = tmpR; return tmpR; } if(n == 0) { record.at(0) = 1; return 1; } char c_n = s.at(0); char c_n1 = s.at(1); int str2num = (c_n - '0') * 10 + (c_n1 - '0'); bool tag1 = c_n > '0'; // 首字母不为0 bool tag2 = str2num <= 26 && tag1 == 1; // 首字母不为0,且值小于27 int num = 0; if(tag1 && tag2) { num = numDecodingsByDP(s.substr(1), record) + numDecodingsByDP(s.substr(2), record); }else if(tag1) { num = numDecodingsByDP(s.substr(1), record); }else if(tag2) { num = numDecodingsByDP(s.substr(2), record); } record.at(n) = num; return num; } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u012365383/article/details/46890627