-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMain5.java
More file actions
86 lines (80 loc) · 2.59 KB
/
Main5.java
File metadata and controls
86 lines (80 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package JZOfferTuJi;
import java.util.HashMap;
import java.util.Map;
public class Main5 {
// 暴力
public int maxProduct(String[] words) {
int maxLength = 0;
int n = words.length;
for(int i=0; i<n; i++){
String word1 = words[i];
for(int j=i+1; j<n; j++){
String word2 = words[j];
if(!hasSameChar(word1, word2)){
maxLength = Math.max(maxLength, word1.length() * word2.length());
}
}
}
return maxLength;
}
private boolean hasSameChar(String word1, String word2) {
int[] count = new int[26];
for (char c: word1.toCharArray()) count[c - 'a'] = 1;
for (char c: word2.toCharArray()){
if(count[c - 'a'] == 1)
return true;
}
return false;
}
}
class Main5_1{
// 位运算优化,优化时间复杂度,看是否出现了重复计算。可以将运算过的每个单词的bitMask存储在数组中。
public int maxProduct(String[] words) {
int n = words.length;
int[] masks = new int[n];
for(int i=0; i<n; i++){
int bitMask = 0;
for(char c: words[i].toCharArray()){
bitMask |= (1 << (c - 'a'));
}
masks[i] = bitMask;
}
int maxLength = 0;
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
if((masks[i] & masks[j]) == 0){
maxLength = Math.max(maxLength, words[i].length() * words[j].length());
}
}
}
return maxLength;
}
private boolean hasSameChar(String word1, String word2) {
int bitMask1 = 0, bitMask2 = 0;
for(char c: word1.toCharArray()) bitMask1 |= 1 << (c - 'a');
for(char c: word2.toCharArray()) bitMask2 |= 1 << (c - 'a');
return (bitMask1 & bitMask2) != 0;
}
}
class Main5_2{
public int maxProduct(String[] words) {
int n = words.length;
Map<Integer, Integer> map = new HashMap<>();
for(int i=0; i<n; i++){
int bitMask = 0;
for(char c: words[i].toCharArray()){
bitMask |= (1 << (c - 'a'));
}
map.put(bitMask, Math.max(map.getOrDefault(bitMask, 0), words[i].length()));
}
int maxLength = 0;
for(int x: map.keySet()){
for(int y: map.keySet()){
if((x & y) == 0){
maxLength = Math.max(maxLength, map.get(x) * map.get(y));
}
}
}
return maxLength;
}
}