parent
3997009620
commit
b975d71de0
@ -1,28 +1,54 @@
|
|||||||
package 第03期.mca_09;
|
package 第03期.mca_09;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
// 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
|
// 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
|
||||||
// 测试链接 : https://leetcode.cn/problems/longest-substring-without-repeating-characters/
|
// 测试链接 : https://leetcode.cn/problems/longest-substring-without-repeating-characters/
|
||||||
public class Code02_LongestSubstringWithoutRepeatingCharacters {
|
public class Code02_LongestSubstringWithoutRepeatingCharacters {
|
||||||
|
|
||||||
public static int lengthOfLongestSubstring(String s) {
|
public static int lengthOfLongestSubstring(String str) {
|
||||||
if (s == null || s.equals("")) {
|
if (str == null || str.length() == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
char[] str = s.toCharArray();
|
// 长度 >= 1
|
||||||
int[] map = new int[256];
|
char[] s = str.toCharArray();
|
||||||
for (int i = 0; i < 256; i++) {
|
int n = s.length;
|
||||||
map[i] = -1;
|
int[] preIndex = new int[256];
|
||||||
}
|
Arrays.fill(preIndex, -1);
|
||||||
map[str[0]] = 0;
|
|
||||||
int N = str.length;
|
|
||||||
int ans = 1;
|
int ans = 1;
|
||||||
int pre = 1;
|
int preAns = 1;
|
||||||
for (int i = 1; i < N; i++) {
|
preIndex[s[0]] = 0;
|
||||||
pre = Math.min(i - map[str[i]], pre + 1);
|
for (int i = 1; i < n; i++) {
|
||||||
ans = Math.max(ans, pre);
|
int preApear = preIndex[s[i]];
|
||||||
map[str[i]] = i;
|
int p1 = i - preApear;
|
||||||
|
int p2 = preAns + 1;
|
||||||
|
int curAns = Math.min(p1, p2);
|
||||||
|
ans = Math.max(ans, curAns);
|
||||||
|
preIndex[s[i]] = i;
|
||||||
|
preAns = curAns;
|
||||||
}
|
}
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// public static int lengthOfLongestSubstring(String s) {
|
||||||
|
// if (s == null || s.equals("")) {
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
// char[] str = s.toCharArray();
|
||||||
|
// int[] map = new int[256];
|
||||||
|
// for (int i = 0; i < 256; i++) {
|
||||||
|
// map[i] = -1;
|
||||||
|
// }
|
||||||
|
// map[str[0]] = 0;
|
||||||
|
// int N = str.length;
|
||||||
|
// int ans = 1;
|
||||||
|
// int pre = 1;
|
||||||
|
// for (int i = 1; i < N; i++) {
|
||||||
|
// pre = Math.min(i - map[str[i]], pre + 1);
|
||||||
|
// ans = Math.max(ans, pre);
|
||||||
|
// map[str[i]] = i;
|
||||||
|
// }
|
||||||
|
// return ans;
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,91 +0,0 @@
|
|||||||
package 第03期.mca_09;
|
|
||||||
|
|
||||||
// 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额
|
|
||||||
// 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0
|
|
||||||
// 假设每一种面额的硬币有无限个
|
|
||||||
// 题目数据保证结果符合 32 位带符号整数
|
|
||||||
// 测试链接 : https://leetcode.cn/problems/coin-change-ii/
|
|
||||||
public class Code05_CoinChange {
|
|
||||||
|
|
||||||
public static int change1(int aim, int[] arr) {
|
|
||||||
return process1(arr, 0, aim);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int process1(int[] arr, int i, int j) {
|
|
||||||
if (j < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (i == arr.length) {
|
|
||||||
return j == 0 ? 1 : 0;
|
|
||||||
}
|
|
||||||
return process1(arr, i + 1, j) + process1(arr, i, j - arr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int change2(int aim, int[] arr) {
|
|
||||||
int n = arr.length;
|
|
||||||
int[][] dp = new int[n][aim + 1];
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
for (int j = 0; j <= aim; j++) {
|
|
||||||
dp[i][j] = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return process2(arr, 0, aim, dp);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int process2(int[] arr, int i, int j, int[][] dp) {
|
|
||||||
if (j < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (i == arr.length) {
|
|
||||||
return j == 0 ? 1 : 0;
|
|
||||||
}
|
|
||||||
if (dp[i][j] != -1) {
|
|
||||||
return dp[i][j];
|
|
||||||
}
|
|
||||||
int ans = process2(arr, i + 1, j, dp) + process2(arr, i, j - arr[i], dp);
|
|
||||||
dp[i][j] = ans;
|
|
||||||
return ans;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int change3(int aim, int[] arr) {
|
|
||||||
int n = arr.length;
|
|
||||||
int[][] dp = new int[n + 1][aim + 1];
|
|
||||||
dp[n][0] = 1;
|
|
||||||
for (int i = n - 1; i >= 0; i--) {
|
|
||||||
for (int j = 0; j <= aim; j++) {
|
|
||||||
dp[i][j] = dp[i + 1][j];
|
|
||||||
if (j - arr[i] >= 0) {
|
|
||||||
dp[i][j] += dp[i][j - arr[i]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dp[0][aim];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int change4(int aim, int[] arr) {
|
|
||||||
int n = arr.length;
|
|
||||||
int[] dp = new int[aim + 1];
|
|
||||||
dp[0] = 1;
|
|
||||||
for (int i = n - 1; i >= 0; i--) {
|
|
||||||
for (int j = 0; j <= aim; j++) {
|
|
||||||
if (j - arr[i] >= 0) {
|
|
||||||
dp[j] += dp[j - arr[i]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dp[aim];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int change5(int aim, int[] arr) {
|
|
||||||
int n = arr.length;
|
|
||||||
int[] dp = new int[aim + 1];
|
|
||||||
dp[0] = 1;
|
|
||||||
for (int i = n - 1; i >= 0; i--) {
|
|
||||||
for (int j = arr[i]; j <= aim; j++) {
|
|
||||||
dp[j] += dp[j - arr[i]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dp[aim];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue