Leetcode-91. Decode Ways

Leetcode-91.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.

代码:

class Solution {
public:
	int numDecodings(string s) {
		int size = s.size();
		if (size == 0)return 0;
		if (size == 1&&s[0]!='0')return 1;
		if (s[0] == '0')return 0;
		vector<int>num(size,1);
		for (int i = 1; i < size;i++){
			if (s[i] == '0'){//当这个位上是0的时候
				if (s[i - 1]>'2'||s[i-1]=='0'){
					return 0;
				}
				else num[i] =i>1?num[i - 2]:1;
			}
			else{//当这个位上是非0的时候
				if (s[i - 1] == '0' || s[i - 1]>'2')num[i] = num[i - 1];
				else if (s[i-1]=='2'&&s[i]>'6')num[i] = num[i - 1];
				else num[i] = (i>1?num[i - 2]:0)+(i>1?num[i-1]:(num[i-1]+1));
			}
		}
		return num[size - 1];
	}
};
运行结果:

Submission Result: Accepted  More Details 

解析:题目不难,但是需要注意的细节很多。这道题目主要考察两点:

1. 代码对测试数据的完备性。

2. 动态规划思想。

对于第1点,字符串中的每个可能出现的数字都在0-9之间,但是英文字母只有26个,所以这道题会比较复杂,总的来时,我的代码逻辑为:

A.判断当前字符是'0',如果是‘0’的话,那就是表明当前字符只能和它的前一个字符组合一个数,但是这个时候要注意两种情况:第1种是当它的前面一个

字符也是'0'的时候,那么两个‘0’不能组合任何字母,所以直接返回0;第2种情况就是如果它的前一个字符大于‘2’则当前字符也不能它的前一个字符组合成

一个字母,这个时候直接返回0;

B:如果当前字符不是‘0’,则要判断它的前一位:

1.如果前一位是'0'或者前一位大于‘2’,则当前字符不能和它的前一个字符进行组合,则num[n]=num[i-1];

2.如果前一个字符刚好是'2',但是当前字符大于'6',则表示当前字符依然不能和前一个字符进行组合;

3.如果前两张情况都不满足,则说明s[i]可以和s[i-1]进行组合从而形成一个新的字符,所以num[i]=num[i-1]+num[i-2],其中,num[i-1]表示不和前面的

字符进行组合,num[i-2]表示当前字符和它前面一个字符进行组合;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值