码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode]Decode Ways

时间:2015-02-08 15:31:06      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:leetcode   动态规划   string   

首先注意到此题具有递归解,处理到第i个数字的时候,有两种情况:

1, s[i]是单独的一个字母

2, s[i]与s[i - 1]合并成一个合法的字母(在0和26之间)


在第i位的decode ways是两者之和


res[i] = s[i] != ‘0‘ ? res[i - 1] : 0 + isValid(s[i], s[i - 1]) ? res[i - 2] : 0;

由于只需要保存前两个结果,只需要const space


做得时候才发现可能会有invalid的case,所以如果上边两个条件都不满足,则直接返回0.


bool isValid(const char &a, const char &b) {
        if (a > '2' || (a == '2' && b > '6') || a == '0') {
            return false;
        }
        return true;
    }
    int numDecodings(string s) {
        int sz = s.size();
        if (sz == 0) {
            return 0;
        }
        int r1 = 1;
        if (s[0] == '0') {
            r1 = 0;
        }
        int r2 = 1;
        for (int i = 1; i < sz; i ++) {
            int curr = 0;
            if (s[i] != '0') {
                curr += r1;
                if (isValid(s[i - 1], s[i])) {
                    curr += r2;
                }
            } else {
                if (!isValid(s[i - 1], s[i])) {
                    return 0;
                } else {
                    curr = r2;
                }
            }
            r2 = r1;
            r1 = curr;
        }
        return r1;


[leetcode]Decode Ways

标签:leetcode   动态规划   string   

原文地址:http://blog.csdn.net/lzzhang07/article/details/43636489

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!