首页 > 代码库 > leetcode:Decode Ways

leetcode:Decode Ways

一、     题目

给定一个字符串包含26个字母,字母与数字产生映射,如:

‘A’  --> 1

‘B’  --> 2

‘Z’ --> 26

如果给一串数字,请给出编码的方式有多少?

  *注意:’12’ 可以编码成”AB”,也可以编码成”L”.

二、     分析

可以看出题目的目的是考察动态规划,即每走一步可能有两种情况,是不是和爬台阶很像呢?对的。

这道题思路有两种但是思路是一样的:

1、         从前往后遍历

(1)、ans[0] = 1;

(2)、如果s[0] = ‘0’,ans[1] = 0;否则ans[1] = 1;

(3)、遍历判断s[i-1]是否等于’0’,为0则ans[i] = 0;否则等于ans[i-1],再判断与后面一位组成的数是否大于26,小于则ans[i]= ans[i] + ans[i-2]

2、         从后往前遍历

(1)、ans[len] = 1;

(2)、如果s[len-1] = ‘0’,ans[len-1] = 0;否则ans[len-1]= 1;

(3)、遍历判断s[i]是否等于’0’,为0则continue;否则判断与后面一位组成的数是否大于26,大于则ans[i] = ans[i+1],否则ans[i] = ans[i+1] + ans[i+2]

1、正序遍历法:

class Solution {
public:
    int numDecodings(string s) {
        int len = s.size();
        if(len == 0) return 0;
        int ans[len+1];
        ans[0] =1;
        if(s[0] != '0')
        	ans[1] = 1;
        else ans[1] = 0;

        for(int i=2;i<=len;i++){
        	if(s[i-1] != '0')
        		ans[i] = ans[i-1];
        	else ans[i] = 0;
        	if(s[i-2] == '1'||(s[i-2] == '2' && s[i-1] <= '6'))
        		ans[i] = ans[i] + ans[i-2];
        }
        return ans[len]; 
    }
};


2、逆序遍历法:

class Solution {
public:
    int numDecodings(string s) {
        int len = s.size();
        if(len == 0) return 0;
        int ans[len+1];
        memset(ans,0,len*sizeof(int));
        ans[len] =1;
        if(s[len-1] != '0')
        	ans[len-1] = 1;
        else ans[len-1] = 0;

        for(int i=len-2;i>=0;i--){
        	if(s[i] == '0')
        		continue;
        	if(s[i] > '2'||(s[i] == '2' && s[i+1] > '6'))
        		ans[i] = ans[i+1];
        	else ans[i] = ans[i+1] + ans[i+2];
        }
        return ans[0]; 
    }
};



 

leetcode:Decode Ways