题目:

有一个消息包含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];
    }
};

wydong
40 声望5 粉丝

wyd


下一篇 »
编辑距离