Skip to content

Commit 582ca37

Browse files
committed
update on 2020-5-17
1 parent 5817dce commit 582ca37

File tree

7 files changed

+268
-83
lines changed

7 files changed

+268
-83
lines changed

src/class11/Code06_ConvertToLetterString.java

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,54 @@ public static int process(char[] str, int i) {
1616
if (i == str.length) { // base case
1717
return 1;
1818
}
19-
// i没有到终止位置
2019
if (str[i] == '0') {
2120
return 0;
2221
}
23-
24-
// i没有到终止位置
25-
// str[i]字符不是‘0’
2622
if (str[i] == '1') {
27-
int res = process(str, i + 1); // i自己作为单独的部分,后续有多少种方法
23+
int res = process(str, i + 1);
2824
if (i + 1 < str.length) {
29-
res += process(str, i + 2); // (i和i+1)作为单独的部分,后续有多少种方法
25+
res += process(str, i + 2);
3026
}
3127
return res;
3228
}
3329
if (str[i] == '2') {
34-
int res = process(str, i + 1); // i自己作为单独的部分,后续有多少种方法
35-
// (i和i+1)作为单独的部分并且没有超过26,后续有多少种方法
30+
int res = process(str, i + 1);
3631
if (i + 1 < str.length && (str[i + 1] >= '0' && str[i + 1] <= '6')) {
3732
res += process(str, i + 2); // (i和i+1)作为单独的部分,后续有多少种方法
3833
}
3934
return res;
4035
}
41-
// str[i] == '3' ~ '9'
4236
return process(str, i + 1);
4337
}
38+
39+
public static int dpWays2(String s) {
40+
if (s == null || s.length() == 0) {
41+
return 0;
42+
}
43+
char[] str = s.toCharArray();
44+
int N = str.length;
45+
int[] dp = new int[N+1];
46+
dp[N] = 1;
47+
for(int i = N-1; i >= 0; i--) {
48+
if (str[i] == '0') {
49+
dp[i] = 0;
50+
}
51+
if (str[i] == '1') {
52+
dp[i] = dp[i + 1];
53+
if (i + 1 < str.length) {
54+
dp[i] += dp[i + 2];
55+
}
56+
}
57+
if (str[i] == '2') {
58+
dp[i] = dp[i + 1];
59+
if (i + 1 < str.length && (str[i + 1] >= '0' && str[i + 1] <= '6')) {
60+
dp[i] += dp[i + 2]; // (i和i+1)作为单独的部分,后续有多少种方法
61+
}
62+
}
63+
}
64+
return dp[0];
65+
}
66+
4467

4568
public static int dpWays(String s) {
4669
if (s == null || s.length() == 0) {
@@ -72,6 +95,7 @@ public static int dpWays(String s) {
7295

7396
public static void main(String[] args) {
7497
System.out.println(number("11111"));
98+
System.out.println(dpWays2("11111"));
7599
}
76100

77101
}

src/class11/Code08_CardsInLine.java

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ public static int win1(int[] arr) {
1212
);
1313
}
1414

15+
// L....R
16+
// F S L+1..R
17+
// L..R-1
1518
public static int f(int[] arr, int L, int R) {
1619
if (L == R) {
1720
return arr[L];
@@ -23,39 +26,56 @@ public static int f(int[] arr, int L, int R) {
2326
);
2427
}
2528

26-
// i..j
27-
public static int s(int[] arr, int i, int j) {
28-
if (i == j) {
29+
// arr[L..R]
30+
public static int s(int[] arr, int L, int R) {
31+
if (L == R) {
2932
return 0;
3033
}
3134
return Math.min(
32-
f(arr, i + 1, j), // arr[i]
33-
f(arr, i, j - 1) // arr[j]
35+
f(arr, L + 1, R), // arr[i]
36+
f(arr, L, R - 1) // arr[j]
3437
);
3538
}
3639

3740
public static int win2(int[] arr) {
3841
if (arr == null || arr.length == 0) {
3942
return 0;
4043
}
41-
int[][] f = new int[arr.length][arr.length];
42-
int[][] s = new int[arr.length][arr.length];
43-
for (int j = 0; j < arr.length; j++) {
44-
f[j][j] = arr[j];
45-
for (int i = j - 1; i >= 0; i--) {
46-
f[i][j] = Math.max(arr[i] + s[i + 1][j], arr[j] + s[i][j - 1]);
47-
s[i][j] = Math.min(f[i + 1][j], f[i][j - 1]);
44+
int N = arr.length;
45+
int[][] f = new int[N][N];
46+
int[][] s = new int[N][N];
47+
for(int i = 0; i < N;i++) {
48+
f[i][i] = arr[i];
49+
}
50+
// s[i][i] = 0;
51+
for(int i = 1; i < N;i++) {
52+
int L =0;
53+
int R =i;
54+
while(L < N && R < N) {
55+
56+
f[L][R] = Math.max(
57+
arr[L] + s[L + 1][ R],
58+
arr[R] + s[L][R - 1]
59+
);
60+
s[L][R] = Math.min(
61+
f[L + 1][R], // arr[i]
62+
f[L][R - 1] // arr[j]
63+
);
64+
65+
L++;
66+
R++;
67+
4868
}
4969
}
50-
return Math.max(f[0][arr.length - 1], s[0][arr.length - 1]);
70+
return Math.max(f[0][N-1], s[0][N-1]);
5171
}
5272

5373
public static void main(String[] args) {
54-
int[] arr = { 4,7,9,5 };
74+
int[] arr = { 4,7,9,5,19,29,80,4 };
5575
// A 4 9
5676
// B 7 5
57-
System.out.println(f(arr,0,3));
58-
System.out.println(s(arr,0,3));
77+
System.out.println(win1(arr));
78+
System.out.println(win2(arr));
5979

6080
}
6181

src/class12/Code02_StickersToSpellWord.java

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,53 +6,64 @@
66
public class Code02_StickersToSpellWord {
77

88
public static int minStickers1(String[] stickers, String target) {
9+
910
int n = stickers.length;
10-
int[][] map = new int[n][26];
11-
HashMap<String, Integer> dp = new HashMap<>();
11+
12+
int[][] map = new int[n][26];// stickers -> [26] [26] [26]
1213
for (int i = 0; i < n; i++) {
1314
char[] str = stickers[i].toCharArray();
1415
for (char c : str) {
1516
map[i][c - 'a']++;
1617
}
1718
}
19+
HashMap<String, Integer> dp = new HashMap<>();
1820
dp.put("", 0);
1921
return process1(dp, map, target);
2022
}
2123

2224
// dp 傻缓存,如果t已经算过了,直接返回dp中的值
2325
// t 剩余的目标
2426
// 0..N每一个字符串所含字符的词频统计
25-
public static int process1(HashMap<String, Integer> dp, int[][] map, String t) {
26-
if (dp.containsKey(t)) {
27-
return dp.get(t);
27+
// 返回值是-1,map 中的贴纸 怎么都无法rest
28+
public static int process1(
29+
HashMap<String, Integer> dp,
30+
int[][] map,
31+
String rest) {
32+
if (dp.containsKey(rest)) {
33+
return dp.get(rest);
2834
}
29-
int ans = Integer.MAX_VALUE;
30-
int n = map.length;
31-
int[] tmap = new int[26];
32-
char[] target = t.toCharArray();
35+
// 以下就是正式的递归调用过程
36+
int ans = Integer.MAX_VALUE; // ans -> 搞定rest,使用的最少的贴纸数量
37+
int n = map.length; // N种贴纸
38+
int[] tmap = new int[26]; // tmap 去替代 rest
39+
char[] target = rest.toCharArray();
3340
for (char c : target) {
3441
tmap[c - 'a']++;
3542
}
3643
for (int i = 0; i < n; i++) {
44+
// 枚举当前第一张贴纸是谁?
3745
if (map[i][target[0] - 'a'] == 0) {
3846
continue;
3947
}
4048
StringBuilder sb = new StringBuilder();
41-
for (int j = 0; j < 26; j++) {
49+
// i 贴纸, j 枚举a~z字符
50+
for (int j = 0; j < 26; j++) { //
4251
if (tmap[j] > 0) { // j这个字符是target需要的
4352
for (int k = 0; k < Math.max(0, tmap[j] - map[i][j]); k++) {
4453
sb.append((char) ('a' + j));
4554
}
4655
}
4756
}
57+
// sb -> i
4858
String s = sb.toString();
4959
int tmp = process1(dp, map, s);
5060
if (tmp != -1) {
5161
ans = Math.min(ans, 1 + tmp);
5262
}
5363
}
54-
dp.put(t, ans == Integer.MAX_VALUE ? -1 : ans);
55-
return dp.get(t);
64+
// ans 系统最大 rest
65+
dp.put(rest, ans == Integer.MAX_VALUE ? -1 : ans);
66+
return dp.get(rest);
5667
}
5768

5869
public static int minStickers2(String[] stickers, String target) {
@@ -128,5 +139,14 @@ public static int process2(int[][] map, int i, int[] tmap, HashMap<String, Integ
128139
dp.put(key, ans);
129140
return ans;
130141
}
142+
143+
public static void main(String[] args) {
144+
String[] arr = {"aaaa","bbaa","ccddd"};
145+
String str = "abcccccdddddbbbaaaaa";
146+
System.out.println(minStickers1(arr, str));
147+
System.out.println(minStickers2(arr, str));
148+
149+
150+
}
131151

132152
}

src/class12/Code03_Knapsack.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,15 @@ public static int process(int[] w, int[] v, int index, int rest) {
5353
public static int dpWay(int[] w, int[] v, int bag) {
5454
int N = w.length;
5555
int[][] dp = new int[N + 1][bag + 1];
56+
// dp[N][...] = 0
5657
for (int index = N - 1; index >= 0; index--) {
57-
for (int rest = 1; rest <= bag; rest++) {
58-
dp[index][rest] = dp[index + 1][rest];
59-
if (rest >= w[index]) {
60-
dp[index][rest] = Math.max(dp[index][rest], v[index] + dp[index + 1][rest - w[index]]);
58+
for (int rest = 0; rest <= bag; rest++) { // rest < 0
59+
int p1 = dp[index+1][rest];
60+
int p2 = -1;
61+
if(rest - w[index] >= 0) {
62+
p2 = v[index] + dp[index + 1][rest - w[index]];
6163
}
64+
dp[index][rest] = Math.max(p1, p2);
6265
}
6366
}
6467
return dp[0][bag];

src/class12/Code05_PalindromeSubsequence.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,17 @@
33
public class Code05_PalindromeSubsequence {
44

55
public static int lcse(char[] str1, char[] str2) {
6+
7+
8+
9+
610
int[][] dp = new int[str1.length][str2.length];
11+
12+
13+
714
dp[0][0] = str1[0] == str2[0] ? 1 : 0;
15+
16+
817
for (int i = 1; i < str1.length; i++) {
918
dp[i][0] = Math.max(dp[i - 1][0], str1[i] == str2[0] ? 1 : 0);
1019
}
@@ -16,7 +25,7 @@ public static int lcse(char[] str1, char[] str2) {
1625
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
1726
if (str1[i] == str2[j]) {
1827
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1);
19-
}
28+
}
2029
}
2130
}
2231
return dp[str1.length - 1][str2.length - 1];

0 commit comments

Comments
 (0)