[LeetCode] Decode Ways 解码方法个数、动态规划

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.

 

这道题要求解码方法,跟之前那道 Climbing Stairs 爬梯子问题 非常的相似,但是还有一些其他的限制条件,比如说一位数时不能为0,两位数不能大于26,其十位上的数也不能为0,出去这些限制条件,根爬梯子基本没啥区别,也勉强算特殊的斐波那契数列,当然需要用动态规划Dynamci Programming来解。建立一位dp数组,长度比输入数组长多多2,全部初始化为1,因为斐波那契数列的前两项也为1,然后从第三个数开始更新,对应数组的第一个数。对每个数组首先判断其是否为0,若是将改为dp赋0,若不是,赋上一个dp值,此时相当如加上了dp[i - 1], 然后看数组前一位是否存在,如果存在且满足前一位不是0,且和当前为一起组成的两位数不大于26,则当前dp值加上dp[i - 2], 至此可以看出来跟斐波那契数组的递推式一样,代码如下:

 

 1 class Solution {
 2 public:
 3     int numDecodings(string s) {
 4         if(s.length()==0) return 0;
 5         if(s.length()>1&&s[0]=='0') return 0;
 6         int len=s.length();
 7         vector<int> v(len+1,0);
 8         v[0]=1;
 9         for(int i=1;i<=len;i++){
10             if(s[i-1]!='0')
11                 v[i]=v[i-1];
12             if(i>1&&(s[i-2]=='1'||(s[i-2]=='2'&&s[i-1]<='6')))
13                 v[i]+=v[i-2];
14         }
15         return v[len];
16         
17     }
18 };

 

posted @ 2017-06-21 17:59  鸭子船长  阅读(311)  评论(0编辑  收藏  举报