91. Decode Ways(M)

题目描述

这里写图片描述

这道题大致的意思就是给你一个全是数字的字符串,按照提供的编码存在几种把数字转化为字母的方式,题目大体上就是这个意思。从题目给出的例子可以看出,之所以存在翻译时的歧义(多种翻译结果),是因为对字符串的分割的不同,比如“123”可以分割为“1,2,3”,“12,3”“1,23”这三种情况。
可能目前还看不出什么,但是你可以试着写一写,比如“1”存在一种翻译方式,“12”存在两种翻译方式,“122”存在三种翻译方式,“1222”存在五种翻译方式。写到这,应该就可以看出Sn、Sn-1、Sn-2存在一种关系(Sn代表字符串的前n个字符)。
仔细一想就会发现,若字符串的最后一个字符能与倒数第二个字符的组合存在两种翻译结果,则Sn = Sn-1 + Sn-2。这个公式就和斐波那契一样了,不过不同的是这儿比斐波那契多了一个判断,只有满足时才符合这个公式。
可以结合原码看一下。什么样的条件下才能满足这个公式
class Solution {
public:
    int numDecodings(string s) {
        string::iterator i = s.begin();
        int size = s.length();
        if (size == 0) return 0;
        int* result = new int[size];
        if (s[0] == '0') {
            return 0;
        } else {
            result[0] = 1;
        }
        if (s[0] > '2' && s[1] == '0') return 0;
        if (((s[0] <= '2' && s[1] <= '6') || (s[0] >= '1' && s[0] < '2')) 
            && s[0] != '0' && s[1] != '0')
            result[1] = 2;
        else 
            result[1] = 1;
        int pre = 1;
        for (int i = 2; i < size; ++i, ++pre) {
            if (((s[pre] <= '2' && s[i] <= '6') || (s[pre] >= '1' && s[pre] < '2')) 
                && s[pre] != '0' && s[i] != '0') {
                result[i] = result[i - 1] + result[i - 2];
            } else {
                if (s[i] != '0')
                    result[i] = result[pre];
                else 
                    result[i] = result[pre - 1];
            }
            if ((s[pre] == '0' || s[pre] > '2') && s[i] == '0') return 0;
        }
        int ans = result[size - 1];
        delete[] result;
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值