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解題報告: