91. Decode Ways(解码方式)
题目链接
https://leetcode.com/problems/decode-ways/description/
题目描述
A message containing letters from
A-Z
is being encoded to numbers using the following mapping:‘A’ -> 1
‘B’ -> 2
…
‘Z’ -> 26Given 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.
题目分析
这道题大体思路很简单,主要问题是0
的处理:
对于s
中的第i
个字符s[i]
,若s[i]
不是0
,那么s[i]
可以作为一个单独的符号解码;若s[i]
是0
,那么s[i]
必须和s[i-1]
组合起来解码。
如果s[i-1]
和s[i]
组合起来属于[10, 26]
,那么可以作为2位数解码, 反之不能。
方法:动态规划
算法描述
遍历s
,对s[i]
:
s[i] = 0 && 10 <= s[i-1]s[i] <= 26: n[i] = n[i - 2]
1 <= s[i] <= 9 && 10 <= s[i-1]s[i] <= 26: n[i] = n[i - 1] + n[i - 2]
1 <= s[i] <= 9 && !(10 <= s[i-1]s[i] <= 26): n[i] = n[i - 1]
其他情况说明不能解码,直接返回0
参考代码
class Solution {
public:
int numDecodings(string s) {
if (s.empty())
return 0;
vector<int> n(s.size() + 1, 1);
if (s[0] != '0')
n[1] = 1;
else
return 0;
for (int i = 2; i < s.size() + 1; i++) {
if (s[i - 1] != '0') {
n[i] = n[i - 1];
if ((s[i - 2] - '0') * 10 + s[i - 1] - '0' <= 26 && s[i - 2] != '0')
n[i] += + n[i - 2];
} else if (s[i - 2] == '0') {
return 0;
} else {
if ((s[i - 2] - '0') * 10 + s[i - 1] - '0' <= 26)
n[i] = n[i - 2];
else
return 0;
}
}
return n[s.size()];
}
};