题目:
有一个消息包含A-Z通过以下规则编码
现在给你一个加密过后的消息,问有几种解码的方式?
样例:
给你的消息为12,有两种方式解码 AB(12) 或者 L(12). 所以返回 2。
思路:
所以:递推式类似于爬楼梯问题: res[i] = res[i-1]+res[i-2]
分析:s[i-1]单独解释的时候,前面可以有res[i-1]种解释方法,如果s[i-1]和s[i-2]共同解释的时候,前面就有res[i-2]种解释方法。
但是需要加更多的限制条件:
1.s[i-1]不能为0,如果是0的话,res[i]就只可能是res[i-2],且满足s[i-2]是1或者2;
2.在s[i-2,i-1]的值大于10小于27的时候,满足res[i] = res[i-1]+res[i-2] 。否则s[i-1]只能单独解释,因此res[i] = res[i-1]。
参考答案:
class Solution {
public:
/*
* @param s: a string, encoded message
* @return: an integer, the number of ways decoding
*/
int numDecodings(string &s) {
// write your code here
int n = s.length();
if(n==0) return 0;
if(s[0] =='0') return 0;
int res[n+1];
res[0] = 1;
res[1] = 1;
for(int i=2; i<=n; i++)
{
if(s[i-1] == '0')
{
if(s[i-2]=='1' | s[i-2]=='2')
res[i] = res[i-2];
else
return 0;
}
//else if(s[i-2]=='1' || s[i-2] == '2' && s[i-1]<='6')
else if(s.substr(i-2,2) <= "26" && s.substr(i-2,2)>"10")
{
res[i] = res[i-1] + res[i-2];
//cout<<i<<" "<<res[i]<<endl;
}
else
{
res[i] = res[i-1];
//cout<<i<<" "<<res[i]<<endl;
}
}
return res[n];
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。