Skip to content

Commit 546350c

Browse files
author
binbin.hou
committed
add code
1 parent 41b844a commit 546350c

File tree

3 files changed

+254
-0
lines changed

3 files changed

+254
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package com..houbb.leetcode.F1300T1400;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* @author binbin.hou
8+
* @since 1.0.0
9+
*/
10+
@Deprecated
11+
public class T_1371_findTheLongestSubstring_V1 {
12+
13+
14+
/**
15+
* 构建对应的数组
16+
*
17+
* 子数组:所以使用前缀和来解决?
18+
* @param s
19+
* @return
20+
*/
21+
public int findTheLongestSubstring(String s) {
22+
// 如果是拆分为5个数组呢?
23+
final int len = s.length();
24+
char[] chars = s.toCharArray();
25+
26+
int[] aSum = initPrefixSum(chars, 'a');
27+
int[] eSum = initPrefixSum(chars, 'e');
28+
int[] iSum = initPrefixSum(chars, 'i');
29+
int[] oSum = initPrefixSum(chars, 'o');
30+
int[] uSum = initPrefixSum(chars, 'u');
31+
32+
// 找到最长的为0的数组
33+
Map<Integer, Integer> countMapA = new HashMap<>();
34+
Map<Integer, Integer> countMapE = new HashMap<>();
35+
Map<Integer, Integer> countMapI = new HashMap<>();
36+
Map<Integer, Integer> countMapO = new HashMap<>();
37+
Map<Integer, Integer> countMapU = new HashMap<>();
38+
// 兼容从零开始的情况
39+
countMapA.put(0, -1);
40+
countMapE.put(0, -1);
41+
countMapI.put(0, -1);
42+
countMapO.put(0, -1);
43+
countMapU.put(0, -1);
44+
45+
int maxLen = 0;
46+
47+
for(int i = 0; i < len; i++) {
48+
int sumA = aSum[i];
49+
int sumE = eSum[i];
50+
int sumI = iSum[i];
51+
int sumO = oSum[i];
52+
int sumU = uSum[i];
53+
54+
55+
if(countMapA.containsKey(sumA)) {
56+
int startIxA = countMapA.get(sumA);
57+
} else {
58+
countMapA.put(sumA, i);
59+
}
60+
61+
if(countMapE.containsKey(sumE)) {
62+
int startIxE = countMapE.get(sumE);
63+
} else {
64+
countMapE.put(sumE, i);
65+
}
66+
67+
if(countMapI.containsKey(sumI)) {
68+
int startIxI = countMapI.get(sumI);
69+
} else {
70+
countMapI.put(sumI, i);
71+
}
72+
73+
if(countMapO.containsKey(sumO)) {
74+
int startIxO = countMapI.get(sumO);
75+
} else {
76+
countMapI.put(sumI, i);
77+
}
78+
}
79+
80+
return maxLen;
81+
}
82+
83+
private int[] initPrefixSum(char[] chars,
84+
char targetChar) {
85+
final int n = chars.length;
86+
int[] prefixSum = new int[n];
87+
Map<Character, Integer> charCount = new HashMap<>();
88+
prefixSum[0] = getCharVal(chars[0], targetChar, charCount);
89+
for(int i = 1; i < n; i++) {
90+
prefixSum[i] = prefixSum[i-1] + getCharVal(chars[i], targetChar, charCount);
91+
}
92+
return prefixSum;
93+
}
94+
95+
private int getCharVal(char c,
96+
char targetChar,
97+
Map<Character, Integer> charCount) {
98+
int count = charCount.getOrDefault(c, 0);
99+
count++;
100+
charCount.put(c, count);
101+
102+
if(c != targetChar) {
103+
return 0;
104+
}
105+
106+
// 让元音字母成对出现
107+
if(count % 2 == 0) {
108+
return 1;
109+
}
110+
return -1;
111+
}
112+
113+
114+
115+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com..houbb.leetcode.F1300T1400;
2+
3+
import java.util.Arrays;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
/**
8+
* @author binbin.hou
9+
* @since 1.0.0
10+
*/
11+
public class T_1371_findTheLongestSubstring_V2 {
12+
13+
14+
private void toggleState(int[] states, int index) {
15+
states[index] = states[index] == 1 ? 0 : 1;
16+
}
17+
18+
/**
19+
* 构建对应的数组
20+
*
21+
* 子数组:所以使用前缀和来解决?
22+
* @param s
23+
* @return
24+
*/
25+
public int findTheLongestSubstring(String s) {
26+
// 如果是拆分为5个数组呢?
27+
final int len = s.length();
28+
char[] chars = s.toCharArray();
29+
30+
// 状态数组
31+
int[] states = new int[5];
32+
Map<String, Integer> map = new HashMap<>();
33+
34+
// 初始化
35+
36+
int maxLen = 0;
37+
for(int i = 0; i < len; i++) {
38+
char c = chars[i];
39+
40+
if(c == 'a') {
41+
toggleState(states, 0);
42+
}else if(c == 'e') {
43+
toggleState(states, 1);
44+
}else if(c == 'i') {
45+
toggleState(states, 2);
46+
}else if(c == 'o') {
47+
toggleState(states, 3);
48+
}else if(c == 'u') {
49+
toggleState(states, 4);
50+
}
51+
52+
// 如果已经有 说明差值相同
53+
String stateString = Arrays.toString(states);
54+
if(map.containsKey(stateString)) {
55+
maxLen = Math.max(maxLen, i - map.get(stateString));
56+
}
57+
58+
// 记录状态
59+
map.put(stateString, i);
60+
}
61+
62+
return maxLen;
63+
}
64+
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com..houbb.leetcode.F1300T1400;
2+
3+
import java.util.Arrays;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
/**
8+
* @author binbin.hou
9+
* @since 1.0.0
10+
*/
11+
public class T_1371_findTheLongestSubstring_V3 {
12+
13+
14+
private void toggleState(int[] states, int index) {
15+
states[index] = states[index] == 1 ? 0 : 1;
16+
}
17+
18+
// 位运算也行
19+
private int calcValue(int[] states) {
20+
int sum = 0;
21+
for(int i = 0; i < states.length; i++) {
22+
sum += states[i] * 10;
23+
}
24+
return sum;
25+
}
26+
27+
/**
28+
* 构建对应的数组
29+
*
30+
* 子数组:所以使用前缀和来解决?
31+
* @param s
32+
* @return
33+
*/
34+
public int findTheLongestSubstring(String s) {
35+
// 如果是拆分为5个数组呢?
36+
final int len = s.length();
37+
char[] chars = s.toCharArray();
38+
39+
// 状态数组
40+
int[] states = new int[5];
41+
Map<Integer, Integer> map = new HashMap<>();
42+
43+
// 初始化
44+
45+
int maxLen = 0;
46+
for(int i = 0; i < len; i++) {
47+
char c = chars[i];
48+
49+
if(c == 'a') {
50+
toggleState(states, 0);
51+
}else if(c == 'e') {
52+
toggleState(states, 1);
53+
}else if(c == 'i') {
54+
toggleState(states, 2);
55+
}else if(c == 'o') {
56+
toggleState(states, 3);
57+
}else if(c == 'u') {
58+
toggleState(states, 4);
59+
}
60+
61+
// 如果已经有 说明差值相同
62+
int val = calcValue(states);
63+
if(map.containsKey(val)) {
64+
maxLen = Math.max(maxLen, i - map.get(val));
65+
}
66+
67+
// 记录状态
68+
map.put(val, i);
69+
}
70+
71+
return maxLen;
72+
}
73+
74+
}

0 commit comments

Comments
 (0)