题目:
有一个消息包含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<<<" "<<