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

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

题目

题目链接

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

示例 1:

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

解题

方法一:回溯

可以把这道题看成字符串分割,“0”~"25"之间的字符串才是符合题意的

class Solution {
public:
    int res=0;
    bool isValid(string& strs,int start,int end){
        string s=strs.substr(start,end-start+1);
        if(s.size()==1&&s[0]<='9'&&s[0]>='0') return true;
        if(s.size()==2&&s>="10"&&s<="25") return true;
        return false;
    }
    void backtracing(string& strs,int startIndex){
        if(startIndex==strs.size()){
            res++;
            return;
        }
        for(int i=startIndex;i<strs.size();i++){
            if(isValid(strs,startIndex,i)){
                backtracing(strs,i+1);
            }
        }
    }
    int translateNum(int num) {
        string strs=to_string(num);
        backtracing(strs,0);
        return res;
    }
};

方法二:动态规划

参考链接

根据动态转移方程的需要,将没有数字的时候,定义为可以翻译一种,即dp[0]=1;

因为dp[1]=1,可以根据dp[0]=1直接传递。

dp[2]可以根据dp[0],dp[1]进行传递,值为1或者2

class Solution {
public:
    int translateNum(int num) {
        string strs=to_string(num);
        int n=strs.size();
        vector<int> dp(n+1,0);
        dp[0]=1,dp[1]=1;
        for(int i=2;i<=n;i++){
            if(strs[i-2]=='1'||(strs[i-2]=='2'&&strs[i-1]<'6')){
                dp[i]=dp[i-1]+dp[i-2];
            }
            else{
                dp[i]=dp[i-1];
            }
        }
        return dp[n];
    }
};

注意,必须要定义成vector dp(n+1,0)而不能是vector dp(n,0)

因为vector dp(n+1,0)初始化要定义dp[0]=1,dp[1]=1;

vector dp(n,0)初始化不能定义成dp[0]=1,dp[1]=2,因为没法保证dp[1]=2,因为2个字符,可能是一种翻译,也可能是两种,这样子的话,就要在定义dp[1]的时候就要判断了,不能像上面一种定义那样,一起放在循环里判断。

相关文章
|
7月前
剑指 Offer 50:第一个只出现一次的字符
剑指 Offer 50:第一个只出现一次的字符
39 0
|
7月前
剑指 Offer 44:数字序列中某一位的数字
剑指 Offer 44:数字序列中某一位的数字
36 0
|
7月前
剑指 Offer 20:表示数值的字符串
剑指 Offer 20:表示数值的字符串
44 0
【LeetCode-每日一题】-面试题46. 把数字翻译成字符串
【LeetCode-每日一题】-面试题46. 把数字翻译成字符串
剑指offer 47. 把数字翻译成字符串
剑指offer 47. 把数字翻译成字符串
70 0
|
算法 C++ Python
【每日算法Day 86】面试经典题:把数字翻译成字符串
【每日算法Day 86】面试经典题:把数字翻译成字符串
100 0
图解LeetCode——剑指 Offer 46. 把数字翻译成字符串
图解LeetCode——剑指 Offer 46. 把数字翻译成字符串
83 0
|
算法
数据结构与算法之[把数字翻译成字符串]&&动态规划
数据结构与算法之[把数字翻译成字符串]&&动态规划
80 0
数据结构与算法之[把数字翻译成字符串]&&动态规划
|
容器
图解LeetCode——剑指 Offer 48. 最长不含重复字符的子字符串
图解LeetCode——剑指 Offer 48. 最长不含重复字符的子字符串
107 0

热门文章

最新文章