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。 应为是组合数,所以应该想清楚的是,如果当前i只有一种解释,那么总数为i-1的数,如果i-1和i合起来还有一种解释,那么就要加上i-2的和。
比较特殊的是,isValid要检查在不在26个字母中间,比较注意的是第一个不要为0. 算结果的时候前两个需要特殊处理一下从第三个开始loop
class Solution {
public:
int numDecodings(string s) {
int n=s.size();
if (n==0)
return 0;
vector<int> res(n,0);
if (s[0]!='0')
res[0]++;
if (n==1)
return res[0];
if(isValid(s.substr(0,2)))
res[1]++;
if (s[0]!='0' && s[1]!='0')
res[1]++;
for (int i=2; i<n; i++){
if (s[i]!='0')
res[i]+=res[i-1];
if (isValid(s.substr(i-1,2)))
res[i]+=res[i-2];
}
return res[n-1];
}
private:
bool isValid(string s){
int size=s.size();
if (size==0)
return false;
if (size==1 && s[0]=='0')
return false;
if (size==2 && ((s[0]=='2' && s[1]>'6')|| s[0]>'2'||s[0]=='0'))
return false;
return true;
}
};
消息解码算法
1439

被折叠的 条评论
为什么被折叠?



