1. 程式人生 > >LeetCode091——解碼方法

LeetCode091——解碼方法

題目描述:

知識點:動態規劃

思路

狀態定義

f(x) -------- 字串s中[0, x - 1]範圍內的子字串的解碼總數

狀態轉移

如果字串s的第一個字元為0,直接返回0。

(1)初值條件:

f(0) = 1。

f(1) = 1。

(2)狀態轉移方程:

a.如果s.charAt(x - 2)對應的字元小於等於2。

a-1:如果s.charAt(x - 2)對應的字元等於2。

a-1-1:如果s.charAt(x - 1)對應的字元小於等於6。

a-1-1-1:如果s.charAt(x - 1)對應的字元不等於0,則f(x) = f(x - 1) + f(x - 2)。

a-1-1-2:如果s.charAt(x - 1)對應的字元等於0,則f(x) = f(x - 2)。

a-1-2:如果s.charAt(x - 1)對應的字元大於6,則f(x) = f(x - 1)。

a-2:如果s.charAt(x - 2)對應的字元等於1。

a-2-1:如果s.charAt(x - 1)對應的字元不等於0,則f(x) = f(x - 1) + f(x - 2)。

a-2-2:如果s.charAt(x - 1)對應的字元等於0,則f(x) = f(x - 2)。

a-3:如果s.charAt(x - 2)對應的字元等於0。

a-3-1:如果s.charAt(x - 1)對應的字元小於等於6。

a-3-1-1:如果s.charAt(x - 1)對應的字元不等於0,則f(x) = f(x - 1)。

a-3-1-2:如果s.charAt(x - 1)對應的字元等於0,則f(x) = 0。

a-3-2:如果s.charAt(x - 1)對應的字元大於6,則f(x) = f(x - 1)。

b.如果s.charAt(x - 2)對應的字元大於2。

b-1:如果s.charAt(x - 1)對應的字元等於0,則f(x) = 0。

b-2:如果s.charAt(x - 1)對應的字元不等於0,則f(x) = f(x - 1)。

時間複雜度和空間複雜度均是O(n),其中n為字串s的長度。

JAVA程式碼:

class Solution {
    public int numDecodings(String s) {
        int[] counts = new int[s.length() + 1];

        counts[0] = 1;
        if(s.charAt(0) == '0') {
            return 0;
        }
        counts[1] = 1;
        for (int i = 2; i <= s.length(); i++) {
            if(s.charAt(i - 2) - '0' <= 2) {
                if(s.charAt(i - 2) == '2') {
                    if(s.charAt(i - 1) - '0' <= 6) {
                        if(s.charAt(i - 1) != '0') {
                            counts[i] = counts[i - 1] + counts[i - 2];
                        }else {
                            counts[i] = counts[i - 2];
                        }
                    }else {
                        counts[i] = counts[i - 1];
                    }
                }else if(s.charAt(i - 2) == '1') {
                    if(s.charAt(i - 1) != '0') {
                        counts[i] = counts[i - 1] + counts[i - 2];
                    }else {
                        counts[i] = counts[i - 2];
                    }
                }else {
                    if(s.charAt(i - 1) - '0' <= 6) {
                        if(s.charAt(i - 1) != '0') {
                            counts[i] = counts[i - 1];
                        }else {
                            counts[i] = 0;
                        }
                    }else {
                        counts[i] = counts[i - 1];
                    }
                }
            }else {
                if(s.charAt(i - 1) == '0') {
                    counts[i] = 0;
                }else {
                    counts[i] = counts[i - 1];
                }
            }
        }
        return counts[s.length()];
    }
}

LeetCode解題報告: