91. 解码方法

自己做
解:滑动窗口

cpp
class Solution {
public:
int numDecodings(string s) {
int f1 = 0; //f(n - 2)
int f2 = 0; //f(n - 1)
int f = 0; //f(n)
//不构成编码
if(s[0] == '0')
return 0;
//一位编码的情况
if(s.size() == 1)
return 1;
//两位编码的情况
if(s.size() >= 2){
if(s[0] == '1' && s[1] <= '9' //能跳两格【共同编码s[0] 与 s[1]】
|| s[0] == '2' && s[1] <= '6')
f1 = 1;
if(s[1] > '0') //能一格一格跳到s[1]
f2 = 1;
f = f1 + f2;
f1 = f2;
f2 = f;
}
//从第三位编码开始
for(int i = 2; i < (int)s.size(); i++){
//能取两位有效【从f(n - 2)跳到f(n) 或者 从f(n - 1)跳到f(n)】
if((s[i - 1] == '1' && s[i] <= '9'
|| s[i - 1] == '2' && s[i] <= '6') //跳两格【从f(n - 2)跳到f(n)】
&& s[i] > '0') //跳一格【从f(n - 1)跳到f(n)】
f = f1 + f2;
//只能取一位【从f(n - 1)跳到f(n)】
else if(s[i] > '0')
f = f2;
//只能取两位【从f(n - 2)跳到f(n)】
else if(s[i - 1] == '1' && s[i] <= '9'
|| s[i - 1] == '2' && s[i] <= '6') //跳两格【从f(n - 2)跳到f(n)】
f = f1;
//都不能取,即构不成编码
else
return 0;
f1 = f2;
f2 = f;
}
return f;
}
};
