美文网首页数据结构与算法
剑指 Offer 46 把数字翻译成字符串

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

作者: itbird01 | 来源:发表于2021-12-18 07:37 被阅读0次

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

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

    解题思路

    解法:
    1.分析题意,我们需要将num转为字符串,我们定义,T[n]为字符串长度n的子串的翻译种类个数
    2.思考一下,T[n]、T[n-1]、numString[n]、numString[n-1]关系
    3.推导可知,if numString[n]numString[n-1]可以组成数字,则T[n]=T[n-1]+T[n-2]
    4.if numString[n]numString[n-1]不可以组成数字,则T[n]=T[n-1]
    5.能否组成数字在于两个条件,如果1==numString[n-1] || (numString[n-1]==2 && numString[n]<=5)成立,则证明可以组成数字

    解题遇到的问题

    后续需要总结学习的知识点

    ##解法1
    class Solution {
        public static void main(String[] args) {
            translateNum(18580);
        }
        public static int translateNum(int num) {
            // 分析题意,我们需要将num转为字符串,我们定义,T[n]为字符串长度n的子串的翻译种类个数
            // 思考一下,T[n]、T[n-1]、numString[n]
            // 推导可以,if numString[n]与numString[n-1]可以组成数字,则T[n]=3+T[n-2]
            // if numString[n]与numString[n-1]不可以组成数字,则T[n]=T[n-1]
            // 能否组成数字在于1<=numString[n-1]<=2 && numString[n]<=5
            String numString = String.valueOf(num);
            if (numString.length() <= 1) {
                return 1;
            }
    
            if (numString.length() == 2) {
                return isE(numString.charAt(0) - '0', numString.charAt(1) - '0')
                        ? 2
                        : 1;
            }
    
            int t0 = 1,
                    t1 = isE(numString.charAt(0) - '0', numString.charAt(1) - '0')
                            ? 2
                            : 1,
                    tn = 1;
            for (int i = 2; i < numString.length(); i++) {
                if (isE(numString.charAt(i - 1) - '0', numString.charAt(i) - '0')) {
                    tn = t1 + t0;
                } else {
                    tn = t1;
                }
                t0 = t1;
                t1 = tn;
            }
            return tn;
        }
    
        public static boolean isE(int a, int b) {
            if (a == 1) {
                return true;
            }
    
            if (a == 2 && b <= 5) {
                return true;
            }
            return false;
        }
    }
    

    相关文章

      网友评论

        本文标题:剑指 Offer 46 把数字翻译成字符串

        本文链接:https://www.haomeiwen.com/subject/upnifrtx.html