91. Decode Ways (DP)

将数字字符解析为A-Z表示的字符串,有几种解析方法:

Input: s = “12”
Output: 2
Explanation: “12” could be decoded as “AB” (1 2) or “L” (12).

因为A-Z最多表示2位数的数字,这里的状态转移理解为向解析字符串后添加一个字母

226 = 22 + 6 : 22解析的所有字符串结尾添加 F
226 = 2 + 26 : 2解析的所有字符串结尾添加Z

d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i] = dp[i-1] + dp[i-2] dp[i]=dp[i1]+dp[i2]

易错点在于不是什么时候都可以这样状态转换的:
1、当前新加入数字是0 --> 没有匹配的字母 --> dp[i-1]转换不成立

2、当前新加入的两个数字不在26范围内或是0开头了 --> 没有匹配的字母 --> dp[i-2]转换不成立

 int numDecodings(string s) {
     
        int n = s.size();
        if(n==0)
            return 0;
        vector<int>dp(n,0);
        if(s[0] != '0')
            dp[0] = 1;
        
        for(int i=1;i<s.size();i++){
     
            int last2 = (s[i-1]-'0')*10 + s[i]-'0';
            if(s[i-1]>'0' && last2<=26){
      //最后两位可以被字母表示
                if(i==1)
                    dp[i] = 1;
                else
                    dp[i] += dp[i-2];
            }
            if(s[i] != '0')
                dp[i] += dp[i-1]; // 直接在s[i-1]基础上加上最后的字母
                
        }
        return dp[n-1];
        
    }

你可能感兴趣的:(91. Decode Ways (DP))