-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaxNumNonOverlSubstr1520.java
More file actions
67 lines (62 loc) · 2 KB
/
MaxNumNonOverlSubstr1520.java
File metadata and controls
67 lines (62 loc) · 2 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
package hard;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MaxNumNonOverlSubstr1520 {
public List<String> maxNumOfSubstrings(String s) {
Seg[] seg = new Seg[26];
for (int i = 0; i < 26; ++i) {
seg[i] = new Seg(-1, -1);
}
// 预处理左右端点
for (int i = 0; i < s.length(); ++i) {
int char_idx = s.charAt(i) - 'a';
if (seg[char_idx].left == -1) {
seg[char_idx].left = seg[char_idx].right = i;
} else {
seg[char_idx].right = i;
}
}
for (int i = 0; i < 26; ++i) {
if (seg[i].left != -1) {
for (int j = seg[i].left; j <= seg[i].right; ++j) {
int char_idx = s.charAt(j) - 'a';
if (seg[i].left <= seg[char_idx].left && seg[char_idx].right <= seg[i].right) {
continue;
}
seg[i].left = Math.min(seg[i].left, seg[char_idx].left);
seg[i].right = Math.max(seg[i].right, seg[char_idx].right);
j = seg[i].left;
}
}
}
// 贪心选取
Arrays.sort(seg);
List<String> ans = new ArrayList<String>();
int end = -1;
for (Seg segment : seg) {
int left = segment.left, right = segment.right;
if (left == -1) {
continue;
}
if (end == -1 || left > end) {
end = right;
ans.add(s.substring(left, right + 1));
}
}
return ans;
}
class Seg implements Comparable<Seg> {
int left, right;
public Seg(int left, int right) {
this.left = left;
this.right = right;
}
public int compareTo(Seg rhs) {
if (right == rhs.right) {
return rhs.left - left;
}
return right - rhs.right;
}
}
}