把数字翻译成字符串( DFS / 剑指offer / LeetCode )

这是一篇关于使用深度优先搜索(DFS)解决将数字转换为特定字符串规则的算法问题,涉及到LeetCode和剑指Offer中的相关挑战。文章通过示例解释了如何计算一个数字的不同翻译方法,并给出了具体的DFS实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目描述

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

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

提示:

0 <= num < 231

思路

直接dfs枚举所有情况,从数字尾部开始处理,每次取出当前数字的个位、十位,并判断能否组成0-25的数字,然后截断数字,不断往下搜索,直到数字变为0,ans加1。

代码如下:

class Solution {
public:
    int translateNum(int num) {
        int ans=0;
        dfs(ans,num);
        return ans;
    }
    void dfs(int &ans,int nownum){
        if(nownum==0){
            ans++;
            return;
        }
        //取出个位
        int nowpos=nownum%10,nextpos=0;
        //取出十位
        if(nownum/10)
            nextpos=(nownum/10)%10;
        //组成新数字
        int num=nextpos*10+nowpos;
        //如果组成新数字在0-25范围
        if(nextpos&&num>=0&&num<=25){
            dfs(ans,nownum/10);
            dfs(ans,nownum/100);
        }
        //如果仅能提取个位作为数字,不能使用十位
        else
            dfs(ans,nownum/10);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值