Skip to content

Commit d0758f7

Browse files
committed
fd
1 parent ea1019d commit d0758f7

File tree

2 files changed

+21
-103
lines changed

2 files changed

+21
-103
lines changed

leetcode/solution/src/DecodeWays.java

Lines changed: 9 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -7,96 +7,18 @@
77
*/
88
public class DecodeWays {
99

10-
/**
11-
* 超时了,有大量的字符串复制,不过思路挺直观的
12-
* 注意这里s为空时要返回0,但是在递归时s为空要返回1,所以为了区分这两种情况,分出了helper
13-
*/
10+
// DP,耗时1ms
1411
public int numDecodings(String s) {
15-
if (s.length() == 0) {
16-
return 0;
17-
}
18-
return helper(s);
19-
}
20-
21-
public int helper(String s) {
22-
/**
23-
* 如果能一直正确匹配到结尾了是合法的
24-
*/
25-
if (s.length() == 0) {
26-
return 1;
27-
}
28-
29-
// 以0开头的是非法的
30-
if (s.charAt(0) == '0') {
31-
return 0;
32-
}
33-
34-
int ways = 0;
35-
36-
if (s.length() > 1 && (s.charAt(0) == '1' || (s.charAt(0) == '2' && (s.charAt(1) >= '0' && s.charAt(1) <= '6')))) {
37-
ways += helper(s.substring(2));
38-
}
39-
40-
ways += helper(s.substring(1));
41-
42-
return ways;
43-
}
44-
45-
/**
46-
// 这里继续优化,为避免重复运算,对结果进行了缓存,性能非常好,耗时2ms
47-
public int numDecodings(String s) {
48-
if (s.length() == 0) {
49-
return 0;
50-
}
51-
int[] f = new int[s.length()];
52-
Arrays.fill(f, -1);
53-
return helper(s.toCharArray(), f, 0);
54-
}
55-
56-
public int helper(char[] s, int[] f, int i) {
57-
if (i >= s.length) {
58-
return 1;
59-
}
60-
61-
if (s[i] == '0') {
62-
return 0;
63-
}
64-
65-
// 这里一定要包括等于0,因为0也是要缓存的,表示后面的子串都不可能合法,比如30.......
66-
if (f[i] >= 0) {
67-
return f[i];
68-
}
69-
70-
int ways = 0;
71-
72-
if (i < s.length - 1 && (s[i] == '1' || (s[i] == '2' && (s[i + 1] >= '0' && s[i + 1] <= '6')))) {
73-
ways += helper(s, f, i + 2);
74-
}
75-
76-
f[i] = ways + helper(s, f, i + 1);
77-
78-
return f[i];
79-
}
80-
*/
81-
82-
// DP,耗时2ms,复杂度O(n)
83-
public int numDecodings2(String s) {
84-
if (s.length() == 0) {
85-
return 0;
86-
}
87-
int n = s.length();
88-
int[] f = new int[n + 1];
89-
f[0] = 1;
90-
f[1] = s.charAt(0) == '0' ? 0 : 1;
91-
92-
for (int i = 1; i < n; i++) {
93-
if (s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) <= '6')) {
94-
f[i + 1] = f[i - 1];
95-
}
12+
int len = s.length();
13+
int[] dp = new int[len];
14+
for (int i = 0; i < len; i++) {
9615
if (s.charAt(i) != '0') {
97-
f[i + 1] += f[i];
16+
dp[i] = i > 0 ? dp[i - 1] : 1;
17+
}
18+
if (i > 0 && (s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) <= '6'))) {
19+
dp[i] += i > 1 ? dp[i - 2] : 1;
9820
}
9921
}
100-
return f[n];
22+
return dp[len - 1];
10123
}
10224
}

leetcode/src/Main.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,21 @@
22

33
public class Main {
44

5-
public double myPow(double x, int n) {
6-
return myPow(x, n);
7-
}
8-
9-
private double myPow(double x, long n) {
10-
if (n == 0) {
11-
return 1;
12-
}
13-
if (n < 0) {
14-
return myPow(1 / x, -n);
15-
}
16-
double res = myPow(x, n / 2);
17-
if (n % 2 != 0) {
18-
return res * res * x;
19-
} else {
20-
return res * res;
5+
public static int numDecodings(String s) {
6+
int len = s.length();
7+
int[] dp = new int[len];
8+
for (int i = 0; i < len; i++) {
9+
if (s.charAt(i) != '0') {
10+
dp[i] += i > 0 ? dp[i - 1] : 1;
11+
}
12+
if (i > 0 && (s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) <= '6'))) {
13+
dp[i] += i > 1 ? dp[i - 2] : 1;
14+
}
2115
}
16+
return dp[len - 1];
2217
}
2318

2419
public static void main(String[] args) {
20+
System.out.println(numDecodings("226"));
2521
}
2622
}

0 commit comments

Comments
 (0)