Skip to content

Commit 0538d8f

Browse files
author
beston
committed
leetcode
1 parent 48976fe commit 0538d8f

File tree

9 files changed

+212
-65
lines changed

9 files changed

+212
-65
lines changed

src/main/java/code/algorithm/dp/Coin.java

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package code.algorithm.dp;
2+
3+
/**
4+
* 〈钱币表示〉<p>
5+
* 有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。
6+
* 给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。
7+
*
8+
* 地推方程:dp[i] += dp[i-1] + dp[i-5] + dp[i-10] + dp[i-25]
9+
*
10+
* @author zixiao
11+
* @date 2020/3/6
12+
*/
13+
public class Coins {
14+
15+
public int waysToChange(int n) {
16+
int[] dp = new int[n+1];
17+
dp[0] = 1;
18+
int[] coins = new int[]{1, 5 ,10, 25};
19+
for(int coin : coins){
20+
for(int i=coin; i<=n; i++){
21+
dp[i] = (dp[i] + dp[i-coin])%1000000007;
22+
}
23+
}
24+
return dp[n];
25+
}
26+
27+
public static void main(String[] args) {
28+
Coins coin = new Coins();
29+
System.out.println(coin.waysToChange(30));
30+
}
31+
32+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package code.algorithm.dp;
2+
3+
/**
4+
* 一般解决动态规划问题,分为四个步骤,分别是
5+
* 1 问题拆解,找到问题之间的具体联系
6+
* 2 状态定义
7+
* 3 递推方程推导
8+
* 4 实现
9+
*
10+
* n个1相加的结果: 1+1+1+1+1+1+1+1+1
11+
* 问题拆解: 9个1等于8个1+1, 8个1等于7个1+1 ...
12+
* 状态变化: 后一个问题的答案 = 前一个问题的答案 + 1,状态的每次变化就是 +1
13+
* 递推方程: dp[i] = dp[i - 1] + 1
14+
*/
15+
public class OnePlus {
16+
17+
public int calc(int n){
18+
int[] dp = new int[n+1];
19+
dp[0] = 0;
20+
21+
for (int i = 1; i <= n; i++) {
22+
dp[i] = dp[i-1]+1;
23+
}
24+
return dp[n];
25+
}
26+
27+
public static void main(String[] args) {
28+
System.out.println(new OnePlus().calc(8));
29+
}
30+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package code.algorithm.dp;
2+
3+
/**
4+
* 爬楼梯,每次走1或2级,爬完n几台阶 有几种方法
5+
* 递推方程:dp[i] = dp[i-1] + dp[i-2]
6+
*/
7+
public class StairDp {
8+
9+
public int f(int n){
10+
int dp[] = new int[n+1];
11+
dp[0] = 0;
12+
dp[1] = 1;
13+
dp[2] = 2;
14+
15+
for (int i = 3; i <= n; i++) {
16+
dp[i] = dp[i-1] + dp[i-2];
17+
}
18+
return dp[n];
19+
}
20+
21+
public static void main(String[] args) {
22+
//89
23+
System.out.println(new StairDp().f(10));
24+
}
25+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package code.algorithm.leetcode;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class P120 {
7+
8+
public int minimumTotal(List<List<Integer>> triangle) {
9+
int n = triangle.size();
10+
int[][] dp = new int[n][n];
11+
12+
//dp最后一行填充 三角形最后一行
13+
List<Integer> lastRow = triangle.get(n-1);
14+
for (int j = 0; j < n; j++) {
15+
dp[n-1][j] = lastRow.get(j);
16+
}
17+
18+
//dp[i][j] = min(dp[i+1][j], dp[i+1][j]) + triangle[i+1][j+1]
19+
for (int i=n-2; i>=0; i--){
20+
for (int j = 0; j < i+1; j++) {
21+
dp[i][j] = Math.min(dp[i+1][j], dp[i+1][j+1]) + triangle.get(i).get(j);
22+
}
23+
}
24+
return dp[0][0];
25+
}
26+
27+
public static void main(String[] args) {
28+
// [2],
29+
// [3,4],
30+
// [6,5,7],
31+
// [4,1,8,3]
32+
List<List<Integer>> triangle = new ArrayList<>();
33+
List<Integer> row = new ArrayList<>();
34+
row.add(2);
35+
triangle.add(row);
36+
37+
row = new ArrayList<>();
38+
row.add(3);
39+
row.add(4);
40+
triangle.add(row);
41+
42+
row = new ArrayList<>();
43+
row.add(6);
44+
row.add(5);
45+
row.add(7);
46+
triangle.add(row);
47+
48+
row = new ArrayList<>();
49+
row.add(4);
50+
row.add(1);
51+
row.add(8);
52+
row.add(3);
53+
triangle.add(row);
54+
55+
System.out.println(new P120().minimumTotal(triangle));
56+
}
57+
}
Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,44 @@
11
package code.algorithm.leetcode;
22

3-
import java.util.Arrays;
3+
import org.springframework.util.Assert;
44

55
/**
6-
* 〈一句话功能简述〉<p>
6+
* 〈零钱兑换〉<p>
77
* 〈功能详细描述〉
8+
* 有1,2,5面值的硬币,现在有amount元,想兑换成硬币,最少需要多少枚硬币?
9+
* 递推方程: dp[i] = min(dp[i-1]+1, dp[i-2]+1, dp[i-5]+1)
810
*
911
* @author zixiao
1012
* @date 2020/1/17
1113
*/
1214
public class P322 {
1315

14-
public int coinChange(int[] coins, int amount) {
15-
if(coins.length == 0 || amount == 0){
16-
return -1;
16+
public int coinChange(int[] coins, int amount){
17+
int len = amount+1;
18+
int[] dp = new int[len];
19+
dp[0] = 0;
20+
21+
for (int i = 1; i <= amount; i++) {
22+
int min = len;
23+
for (int coin : coins){
24+
if(i>=coin && dp[i-coin] != -1){
25+
min = Math.min(min, dp[i-coin]+1);
26+
}
27+
}
28+
dp[i] = min == len ? -1 : min;
1729
}
18-
int maxIdx = coins.length-1;
19-
Arrays.sort(coins);
20-
int i = maxIdx;
30+
return dp[amount];
31+
}
2132

22-
int num = 0;
33+
public static void main(String[] args) {
34+
P322 p322 = new P322();
35+
System.out.println(p322.coinChange(new int[]{2}, 3));
2336

24-
num += amount/coins[i];
25-
amount = amount%coins[i];
37+
System.out.println(p322.coinChange(new int[]{1, 2, 5}, 5));
38+
System.out.println(p322.coinChange(new int[]{1, 2, 5}, 9));
39+
Assert.isTrue(p322.coinChange(new int[]{186,419,83,408}, 6249)==20, "");
2640

27-
return num;
41+
//System.out.println(p322.coinChange(new int[]{2}, Integer.MAX_VALUE));
2842
}
2943

3044
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package code.algorithm.leetcode;
2+
3+
public class P53 {
4+
5+
public int maxSubArray(int[] nums){
6+
if (nums == null || nums.length == 0) {
7+
return 0;
8+
}
9+
10+
int n = nums.length;
11+
int dp[] = new int[n];
12+
dp[0] = nums[0];
13+
14+
int max = dp[0];
15+
for (int i = 1; i < n; i++) {
16+
dp[i] = Math.max(dp[i-1]+nums[i], nums[i]);
17+
max = Math.max(max, dp[i]);
18+
}
19+
return max;
20+
}
21+
22+
public static void main(String[] args) {
23+
System.out.println(new P53().maxSubArray(new int[]{-2,1,-3,4,-1,2,1,-5,4}));
24+
}
25+
}

src/main/java/code/algorithm/search/TrieChinese.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,13 @@ private void findSimilar(TrieNode node, String currentStr, List<String> similarL
103103
* 2、三个指针,p1指向root,p3指向第一个开始匹配敏感字,p2指向当前参与匹配的字
104104
* @param text
105105
* @return
106+
* @see https://www.cnblogs.com/kubidemanong/p/10834993.html
106107
*/
107108
public String filterSensitiveWord(String text){
108109
char[] textArray = text.toCharArray();
109110
TrieNode p1 = root;
110111
int p2 = 0;
111112
int p3 = 0;
112-
boolean matching = false;
113113

114114
while (p2 < textArray.length){
115115
TrieNode next = p1.children.get(textArray[p2]);
@@ -121,29 +121,17 @@ public String filterSensitiveWord(String text){
121121

122122
//从下一个位置重新开始
123123
p2++;
124-
p3++;
124+
p3 = p2;
125125
p1 = root;
126-
matching = false;
127126
} else {
128-
//匹配中
127+
//继续匹配下个字符
129128
p1 = next;
130129
p2++;
131-
matching = true;
132130
}
133-
} else if (matching) {
134-
//匹配中,则p2退回上一个词,p3前进到p2位置
135-
if(p2 - p3 > 1){ //如果相差1,则会死循环
136-
p2--;
137-
}
138-
p3 = p2;
139-
p1 = root;
140-
matching = false;
141131
} else {
142-
//不是匹配中,则从下一个位置重新开始
143-
p2++;
144132
p3++;
133+
p2 = p3;
145134
p1 = root;
146-
matching = false;
147135
}
148136
}
149137
return new String(textArray);
@@ -198,7 +186,15 @@ public static void main(String[] args) {
198186
trie.insert("妈了个逼");
199187

200188
System.out.println(trie.filterSensitiveWord("我去你妈了个逼"));
201-
System.out.println(trie.filterSensitiveWord("我艹他们,狗日的见鬼了"));
189+
System.out.println(trie.filterSensitiveWord("我艹他码,狗日的见鬼了"));
202190
System.out.println(trie.filterSensitiveWord("我们操场见"));
191+
192+
//文本 abcdefghi ,以及三个敏感词"de", "bca", "bcf"
193+
trie = new TrieChinese();
194+
trie.insert("de");
195+
trie.insert("bca");
196+
trie.insert("bcf");
197+
System.out.println(trie.filterSensitiveWord("abcdefghi"));
198+
203199
}
204200
}

src/main/java/code/algorithm/stringmatch/KMPMatcher.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
/**
44
* 〈KMP算法〉<p>
5-
* 〈功能详细描述〉
5+
* Knuth-Morris-Pratt 字符串查找算法,简称为 KMP算法,
6+
* 常用于在一个文本串 S 内查找一个模式串 P 的出现位置。
7+
* 时间复杂度:O(m+n)
68
*
79
* @author zixiao
810
* @date 2020/1/17
@@ -31,7 +33,6 @@ public boolean match(String string, String pattern) {
3133

3234
//2 移动比较
3335
while (curS < sArray.length && curP < pArray.length) {
34-
//System.out.print("curP: " + curP + ", curS:" + curS);
3536
if (sArray[curS] == pArray[curP]) {
3637
curP++;
3738
curS++;
@@ -40,7 +41,6 @@ public boolean match(String string, String pattern) {
4041
break;
4142
}
4243
//移动到nextArray[curP]位置
43-
//System.out.print(" next: " + nextArray[curP]);
4444
curP = nextArray[curP];
4545
//curP指针为-1时
4646
if (curP == -1) {
@@ -51,7 +51,6 @@ public boolean match(String string, String pattern) {
5151
}
5252
move++;
5353
}
54-
//System.out.println();
5554
compare++;
5655
}
5756
boolean match = curP == pArray.length;
@@ -61,7 +60,7 @@ public boolean match(String string, String pattern) {
6160

6261
private int[] getNextArray(char[] pArray) {
6362
int pLen = pArray.length;
64-
//1 前缀后缀的公共元素的最大长度
63+
//1 P串所有子字符串的前缀后缀公共元素的最大长度
6564
int[] maxArray = new int[pLen];
6665
for (int i = 0; i < pLen; i++) {
6766
maxArray[i] = getMaxOfPrefixPostfix(pArray, i);

0 commit comments

Comments
 (0)