剑指 Offer 46 把数字翻译成字符串

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

标签:剑指 Offer发布于:编辑于:浏览量:1499

概述

https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/

遍历 + 缓存

O(n) 时间复杂度,O(n) 空间复杂度。

class Solution {
public:
    string num;
    vector<int> cache;
    int translateNum(int num) {
        this->num = to_string(num);
        cache.resize(this->num.size(), -1);
        return helper(0);
    }

    int helper(int i) {
        if (i == num.size()) return 1;
        if (i == num.size() + 1) return 0;
        if (cache[i] != -1) return cache[i];
        if (num[i] == '1') {
            cache[i] = helper(i+1) + helper(i+2);
        } else if (num[i] == '2') {
            cache[i] = helper(i+1);
            if (i + 1 < num.size() && num[i+1] <= '5') {
                cache[i] += helper(i+2);
            }
        } else {
            cache[i] = helper(i+1);
        }
        return cache[i];
    }
};