美文网首页
LC-91找边界

LC-91找边界

作者: 锦绣拾年 | 来源:发表于2020-01-31 18:06 被阅读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];
        }
    };
    

    相关文章

      网友评论

          本文标题:LC-91找边界

          本文链接:https://www.haomeiwen.com/subject/sbagthtx.html