【剑指Offer】**把数字翻译成字符串(1.dfs 2.动态规划?)

这里写自定义目录标题

题目

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

示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
 
提示:
0 <= num < 231

思路

dfs

在固定了前pos位的前提下,对后续进行翻译,可以截取1位或者2位。

  • 时间复杂度:O(N),需要遍历每一个字符
  • 空间复杂度:O(N),每次都截取1位的情况时递归深度为O(N)

但是不加记忆化肯定是要比动态规划慢的,只是这道题的数字最大就是INT_MAX,如果使用更长的数据的话dfs会呈指数上涨的。

class Solution {
public:
    int translateNum(int num) {
        string str = to_string(num);
        if( str.length() == 1 ){
            return 1;
        }

        anws = 0;
        dfs(str, 0);
        return anws;
    }
private:
    int anws;
    //str[0...pos-1]已经划分好,现在需要对str[pos...n-1]划分
    void dfs( string str, int pos){
        if( pos == str.length() ){
            anws++;
            return;
        }
        //首先我们截取一位
        dfs(str, pos+1);
        //另外如果str[pos..pos+1]小于25,也可以截取两位
        if( satisfy(str, pos) ){
            dfs(str, pos+2);
        }
    }
    bool satisfy(string str, int pos){
        if( pos == str.length()-1 )
            return false;
        if(str[pos]=='0')
            return false;
        if( str.substr(pos, 2) > "25" )//从pos开始的2个字符
            return false;
        return true;
    }
};

动态规划?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值