劍指Offer對答如流系列 - 把數字翻譯成字符串

面試題46:把數字翻譯成字符串

一、題目描述

給定一個數字,我們按照如下規則把它翻譯爲字符串:0翻譯成"a",1翻譯成"b",……,11翻譯成"l",……,25翻譯成"z"。一個數字可能有多個翻譯。例如12258有5種不同的翻譯,它們分別"bccfi", “bwfi”, “bczi”, “mcfi” 和"mzi" 。請編程實現一個函數用來計算一個數字有多少種不同的翻譯方法。

二、問題分析

刷題刷多了,看到這道題的第一印象是可以用遞歸處理。

我們首先找一下關係式:
用f(i)來表示從第i位開始的不同翻譯數目,可以得到有:f(i)=f(i+1)+g(i,i+1)*f(i+2)
i和i+1位數字拼起來在10~25範圍內時g(i,i+1)的值爲1,否則爲0。

因爲存在重複的子問題的情況,遞歸併非最佳方法,我們從數字的末尾開始計算f(i),自下而上解決問題,就可以消除重複的子問題了。先算f(len-1),f(len-2),再根據公式f(i)=f(i+1)+g(i,i+1)*f(i+2)往前逐步推導到f(0),這就是最終要求的結果。

三、問題解決

count[] 充當f()

 public int getTranslationCount(int number) {
        if(number<0) {
            return 0;
        }
        String sNumber=String.valueOf(number);
        int len=sNumber.length();

        int[] counts=new int[len];
        for(int i=len-1;i>=0;i--) {
            if(i==len-1) {
                counts[i]=1;
            } else {
                counts[i]=counts[i+1];
                if(canBeTrans(sNumber,i)) {
                    if(i==len-2) {
                        counts[i]+=1;
                    } else {
                        counts[i]+=counts[i+2];
                    }
                }
            }
        }
        return counts[0];
    }

    private boolean canBeTrans(String sNumber, int i) {
        int a=sNumber.charAt(i)-'0';
        int b=sNumber.charAt(i+1)-'0';
        int convert=a*10+b;
        return convert >= 10 && convert <= 25;
    }
發佈了194 篇原創文章 · 獲贊 3472 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章