现在的位置: 首页 > 综合 > 正文

Decode Ways

2019年07月26日 ⁄ 综合 ⁄ 共 971字 ⁄ 字号 评论关闭

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.

思路:这道题跟走台阶有点类似,可以用dp做。不考虑边界条件时,假设已经编码xxxxxxxx_ _了i-1个数字,现在待编码第i个字符,从题意推导可得:设置num=s[i-1]*10+s[i],如果num>=10&&num<=26,即s[i-1]s[i]可以编码成一个字符。用f[i]表示编码的方法数,i表示编码数字的下标,则f[i]+=f[i-2];如果s[i]!='0',则可以由i-1编码到i,则f[i]+=f[i-1]。

class Solution {
public:
    int numDecodings(string s) {
        int len = s.length(),i;
		vector<int> f;
		f.resize(len);
		for(i=0; i<len; ++i)
		{
			f[i] = 0;
		}
		if (len == 0)
		{
			return 0;
		}
		if (s[0] != '0')
		{
			f[0] = 1;
		}
		if (len == 1)
		{
			return f[0];
		}
		int num = (s[0] - '0')*10 + (s[1] - '0');
		if ((num > 10 && num < 20) || (num > 20 && num <= 26))
		{
			f[1] = 2;
		}
		if (num == 10 || num == 20 || (num > 26 && s[1] != '0'))
		{
			f[1] = 1;
		}
		if (len == 2)
		{
			return f[1];
		}
		for(i=2; i<len; ++i)
		{
			num = (s[i-1] - '0') * 10 + s[i] - '0';
			if (num >= 10 && num <= 26)
			{
				f[i] += f[i-2];
			}
			if (s[i] != '0')
			{
				f[i] += f[i-1];
			}
		}
		return f[len-1];
    }
};
【上篇】
【下篇】

抱歉!评论已关闭.