1. 程式人生 > 其它 >46. 把數字翻譯成字串

46. 把數字翻譯成字串

 111->AK,KA,AAA
從左往右嘗試的模型
char[],i
從i開始嘗試
i=1 ->A
可以當一個,也可以當兩個,但要排除0
i=2時可以當一個,也可以當兩個,但第二個要<=6
eg:
1 1 1
0 1 2
拿1個位置去轉
拿兩個位置去轉
同時判斷拿1個位置或兩個位置去轉時是否是有效的,這個決定是否是有效的決定
i ->f(i+1)
i,i+1 ->f(i+2)
無效的決定如何考慮?
拿1個位置去轉時,0是無效解
拿2個位置去轉時,>26是無效解

 public static int number(String str){
        if(str==null||str.length()==0){
            return 0;
        }
        return process(str.toCharArray(),0);
    }


    /**
     *
     i 之前的位置,如何轉化已經做過決定了,不用再關心
     str[i.....]有多少種轉化的結果
     */
    public static int process(char[] str,int i){

        //base case
       //字元處理完成,可以當成一種結果
        if(i==str.length){
            //轉化的過程中,之前做的決定都構成後續,當來到終點位置時,構成一種有效結果
            return 1;
        }
        //說明還有字元,i沒有到終止位置
        // 0單獨出現,沒有這種可能
        if(str[i]=='0'){
            return 0;
        }

        //當i=1時,有兩種選擇,選1個轉,選2個轉
        if(str[i]=='1'){
            //選1個轉,i來到下一個位置
            int res=process(str,i+1);
            //i+1沒有越界的時候,可以選2個字元來轉
            if(i+1<str.length){
                res+=process(str,i+2);
            }
            return res;
        }
       //當i=2時,有兩種選擇,選1個轉,選2個轉
        if(str[i]=='2'){
            int res=process(str,i+1);
            //選2個轉時,要滿足以下條件:不越界,而且第二個數的範圍在0-6
            if(i+1<str.length && (str[i+1]>='0'&& str[i+1]<='6')){
                res+=process(str,i+2);
            }
            return res;
        }

        //當>2時,只能選一個轉
        return process(str,i+1);
    }

  

給定一個數字,我們按照如下規則把它翻譯為字串:

0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。

一個數字可能有多個翻譯。請程式設計實現一個函式,用來計算一個數字有多少種不同的翻譯方法。

示例 1:

輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

class Solution {
    public int translateNum(int num) {
        String str=String.valueOf(num);
        char[] chs=str.toCharArray();
        return process(chs,0);


    }

    private int process(char[] chs,int i){
        //base case
        if(i==chs.length){
            return 1;
        }

        if(chs[i]=='1'){
            int res=process(chs,i+1);
            if(i+1<chs.length){
                res+=process(chs,i+2);
            }
            return res;
        }

        if(chs[i]=='2'){
            int res=process(chs,i+1);
           // if(i+1<chs.length && '0'<=chs[i+1]<='5'){ 錯誤的寫法
              if(i+1<chs.length && chs[i+1]>='0' && chs[i+1]<='5'){
                res+=process(chs,i+2);
            }
        }
        return process(chs,i+1);

    }
    }