LC-91找边界

2020-01-31  本文已影响0人  锦绣拾年

题目

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:

输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-ways
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目解析

这个题找边界真的很烦人

很喜欢的很简洁的一个题解

int numDecodings(string s) {
    if (s[0] == '0') return 0;
    int pre = 1, curr = 1;//dp[-1] = dp[0] = 1
    for (int i = 1; i < s.size(); i++) {
        int tmp = curr;
        if (s[i] == '0')
            if (s[i - 1] == '1' || s[i - 1] == '2') curr = pre;
            else return 0;
        else if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] >= '1' && s[i] <= '6'))
            curr = curr + pre;
        pre = tmp;
    }
    return curr;
}

作者:pris_bupt
链接:https://leetcode-cn.com/problems/decode-ways/solution/c-wo-ren-wei-hen-jian-dan-zhi-guan-de-jie-fa-by-pr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以下是我乱糟糟的写法

class Solution {
public:
    int numDecodings(string s) {
        int len=s.length();
        int rec[len];
        memset(rec,0,sizeof(rec));
        //rec[i]=rec[i-1]+1+(rec[i-2]+1);错误 考虑解码方式不是解码的字母数
        //rec[i]=
        if(len==1){
            if(s[0]-'0'>0)
                 return 1;
            else
                return 0;
        }
                   
        
        if(s[0]-'0'>0)
            rec[0]=1;
        else
            return 0;
        int rmo=(s[0]-'0')*10+(s[1]-'0');
        if(rmo<=26){
            if(rmo==0){
                rec[1]=0;
            }else if(rmo<=10||rmo%10==0)
                rec[1]=1;
            else{
                rec[1]=2;
            }
        }     
        else 
            rec[1]=rec[0];
        if(s[1]=='0'&&rmo>26&&len>1)
            return 0;
        
        for(int i=2;i<len;i++){
            rec[i]=rec[i-1];
            if(s[i]=='0'&&(s[i-1]>='3'||s[i-1]=='0')){                
                    return 0;               
            }else if(s[i]=='0'&&s[i-1]>'0'&&s[i-1]<'3'){
                rec[i]=rec[i-2];
                continue;
            }
                    
                            
            if((s[i-1]-'0')*10+(s[i]-'0')<=26&&(s[i-1]-'0')*10+(s[i]-'0')>9)
                rec[i]+=rec[i-2];            
            // cout<<rec[i-1]<<endl;
        }
        return rec[len-1];
    }
};
上一篇 下一篇

猜你喜欢

热点阅读