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
Share your acceptance!
解析:题目不难,但是需要注意的细节很多。这道题目主要考察两点:
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]表示当前字符和它前面一个字符进行组合;