LeetCode 91. 解碼方法 Java

91. 解碼方法

難度中等412收藏分享切換爲英文關注反饋

一條包含字母 A-Z 的消息通過以下方式進行了編碼:

'A' -> 1
'B' -> 2
...
'Z' -> 26

給定一個只包含數字的非空字符串,請計算解碼方法的總數。

示例 1:

輸入: "12"
輸出: 2
解釋: 它可以解碼爲 "AB"(1 2)或者 "L"(12)。

示例 2:

輸入: "226"
輸出: 3
解釋: 它可以解碼爲 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

解題思路:首先要想到是斐波那契數列,噹噹前位置可以和前面字符結合,如前面是1,當前是2。 12可以拆開也可以結合。因此

遍歷到當前Fn=Fn-1+Fn-2,但是如果不可以和前面字符結合,如2,7,當前Fn=Fn-1,Fn-1=Fn-2。

 

此外,就是要處理0,因爲0決定了字符串合法與否,並且合法字符串的0一定會與前面的字符相結合,刪除掉不會影響最終結果。

class Solution {
    public static int numDecodings(String s) {
        int pre1 = 1;
        int pre2 = 1;
        
        //不合法字符串 如30
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==48){
                if(i==0||s.charAt(i-1)>50||s.charAt(i-1)==48){
                    return 0;
                }
            }
        }
        //消0,0比較特殊,因爲0一定會和前一位配對,該字母不影響結果。
        String s1 = new String();
        int judge=0;
        for (int i = 0; i < s.length() - 1; i++) {
            if (s.charAt(i + 1) != '0') {
                s1+=String.valueOf(s.charAt(i));
            } else {
                judge=1;
                i++;
            }
        }
        if(s.charAt(s.length()-1)!='0') {
            s1+=s.charAt(s.length()-1);
        }
        if (s1.length() == 0||s1.length()==1 ) {
            return Math.max(judge,s1.length());
        }

        //變形的斐波那契數列
        for(int i=1;i<s1.length();i++){
            int tmp=0;
            if(pair(s1.charAt(i-1),s1.charAt(i))){
                tmp=pre1+pre2;
                pre1=pre2;
                pre2=tmp;
            }
            else{
                pre1=pre2;
            }
        }
        return pre2;
    }
    public static boolean pair(char a,char b){
        if(a==50&&b<55){
            return true;
        }
        if(Integer.valueOf(a)==49) {
            return true;
        }
        return false;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章