关闭

91. Decode Ways

62人阅读 评论(0) 收藏 举报
分类:

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.

思路:跟爬楼梯类似(http://blog.csdn.net/sunflowerhh/article/details/51953709),就是比爬楼梯多一些限制条件。用DP的思想,DP主要就是当最后要求的难一次算出来的时候,通过一步一步算当前状态推出后面的状态来。主要是定义状态,这题的状态就是计算decode的种类。

简单的考虑:如过不考虑限制条件的话:假设输入是“123”,1的时候只有一种;2的时候是可以是2,也可以是12;3的时候可以是1到3,也可以是2到3,也可是3本身。

具体思路:
从i=1开始,分三种情况:dp表示当前的状态
1)s[i]单独是可以解码的,表明s[i-1]到s[i]是成立的,当前的dp=[i-1]时候的dp; 单独解码的条件是不为0;
2)s[i-1]s[i]串在一起可以解码,说明当前的解码方法个数=i-2的时候的解码状态;两个串起来可以解码的条件是要>=26&&<=10,注意09这种不行。

注意:因为要用到i-2的时候状态,所以dp的index比s的index多一个。

 int numDecodings(string s) {
         if(s.empty() || s[0]=='0') return 0;

         vector<int> dp(s.size()+1,0);
         dp[0] = 1;
         dp[1] = 1;

         for(int i = 1; i < s.size(); i++)
         {
             if(s[i]!='0') dp[i+1] += dp[i];

             if(s.substr(i-1,2) <="26" && s.substr(i-1,2) >= "10") dp[i+1] +=dp[i-1];
         }

         return dp[s.size()];
    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:69271次
    • 积分:101
    • 等级:
    • 排名:千里之外
    • 原创:136篇
    • 转载:8篇
    • 译文:0篇
    • 评论:5条
    最新评论