Repository navigation
Expand file tree
/
Copy pathStrings.java
More file actions
88 lines (65 loc) · 2.09 KB
/
Copy pathStrings.java
File metadata and controls
88 lines (65 loc) · 2.09 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
87
88
package modern.challenge;
public final class Strings {
private Strings() {
throw new AssertionError("Cannot be instantiated");
}
public static String longestCommonPrefixV1(String[] strs) {
if (strs == null || strs.length == 0) {
// or throw IllegalArgumentException
return "";
}
if (strs.length == 1) {
return strs[0];
}
int firstLen = strs[0].length();
for (int prefixLen = 0; prefixLen < firstLen; prefixLen++) {
char ch = strs[0].charAt(prefixLen);
for (int i = 1; i < strs.length; i++) {
if (prefixLen >= strs[i].length()
|| strs[i].charAt(prefixLen) != ch) {
return strs[i].substring(0, prefixLen);
}
}
}
return strs[0];
}
public static String longestCommonPrefixV2(String[] strs) {
if (strs == null || strs.length == 0) {
// or throw IllegalArgumentException
return "";
}
if (strs.length == 1) {
return strs[0];
}
int minStr = Integer.MAX_VALUE;
for (String str : strs) {
if (str.length() < minStr) {
minStr = str.length();
}
}
String result = "";
int left = 0;
int right = minStr;
while (left < right) {
int middle = left + (right - left) / 2;
if (isPrefixInAll(strs, left, middle)) {
result = result + strs[0].substring(left, middle + 1);
left = middle + 1;
} else {
right = middle - 1;
}
}
return result;
}
private static boolean isPrefixInAll(String strs[], int start, int end) {
String str = strs[0];
for (String currentStr : strs) {
for (int j = start; j <= end; j++) {
if (currentStr.charAt(j) != str.charAt(j)) {
return false;
}
}
}
return true;
}
}