• [leetcode]Decode Ways


    1...26

    给一个字符串有多少种组成方法。。

    开始觉得嘛。。。

    这个呢。。就是看一位一位的看嘛。。。

    如果新加入的这位可以和前面的组成1..26 之间的数,那么就等于前面那些位能组成的方法+除去前两位组成的方法

    f[i]表示从头到弟i位有多少种方法

    那么就是

    i如果是能和i-1构成 1..26...

    那么f[i] = f[i-1] + f[i-2]

    意思就是i单独的一种方法,和与i-1一起构成两位的方法。

    如果不能f[i] = f[i-1]

    到此,感觉就做完啦。

    不过。。。不过。。。我没有考虑0啊。。。

    有0要特殊处理。。。

    首先第一位肯定不能有0 , 也不能有连续的0

    10,20这种只f[i] = f[i-2]

    00,30,40...等都是非法的。。。。

    class Solution {
    public:
        int numDecodings(string s) {
            if (s == "") return 0;
            if (s[0] == '0') return 0;
            int size = s.size();
            if(size == 1) return 1;
            
            vector<int> f(size , 0);
            
            f[0] = 1;
            f[1] = 2;
           // cout << s[1] << " " << s[0] <<endl;
            //cout << "s[1] = " << s[1] <<endl;
            if(s[1] == '0' && (s[0] == '1' || s[0] == '2')) f[1] = 1;
            if(s[1] == '0' && !(s[0] == '1' || s[0] == '2')) return 0;
            if(s[0] == '2' && (s[1] > '6')) f[1] = 1;
            if(s[0] > '2') f[1] = 1;
            //cout << f[1] <<endl;
            //cout << "coming" <<endl;
            for(int i = 2 ; i < size ; i++){
                f[i] = f[i - 1];
                if(s[i] == '0' && (s[i-1] == '1' || s[i - 1] == '2')) {f[i] = f[i-2];continue;}
                if(s[i] == '0' && !(s[i-1] == '1' || s[i - 1] == '2')) return 0;
                
                if(s[i-1] == '1') f[i] += f[i-2];
                if(s[i-1] == '2' && (s[i] >= '1' && s[i] <= '6')) f[i] += f[i-2];
            }
            return f[size - 1];
        }
    };
  • 相关阅读:
    jsp初识
    OAuth2.0
    微服务参考案例
    3.0技术架构落地
    聚合层改进意见-彭泉锋-2018.10.31
    图片分步加载(解决图片load函数刷新不加载问题)
    IOS iframe宽高问题(来至stackoverflow)
    jquery easy-ui 分页插件的运用(给td添加事件,获取汇总内容)
    JS 获取当前日期(yy-mm-dd HH-MM-SS)
    JQ iframe 子元素找父级 的元素
  • 原文地址:https://www.cnblogs.com/x1957/p/3496714.html
Copyright © 2020-2023  润新知