-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path763. Partition Labels.java
More file actions
38 lines (37 loc) · 1.37 KB
/
763. Partition Labels.java
File metadata and controls
38 lines (37 loc) · 1.37 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
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> partitionLengths = new ArrayList<>();
if (S.length() == 0) {
return new ArrayList<>();
}
Map<Character, Integer> firstOccurrence = new LinkedHashMap<>();
int[] frequencyTable = new int[26];
int[] lastOccurrence = new int[26];
for (int index = 0; index < S.length(); ++index) {
char curChar = S.charAt(index);
if (!firstOccurrence.containsKey(curChar)) {
firstOccurrence.put(curChar, index);
}
lastOccurrence[curChar - 'a'] = index;
++frequencyTable[curChar - 'a'];
}
int curPartitionStart = 0;
int curPartitionEnd = 0;
int lengthCurPartition = 0;
int charsInCurPartition = 0;
for (char c : firstOccurrence.keySet()) {
if (lastOccurrence[c - 'a'] > curPartitionEnd) {
curPartitionEnd = lastOccurrence[c - 'a'];
}
charsInCurPartition += frequencyTable[c - 'a'];
lengthCurPartition = curPartitionEnd - curPartitionStart + 1;
if (charsInCurPartition == lengthCurPartition) {
partitionLengths.add(lengthCurPartition);
curPartitionStart += lengthCurPartition;
curPartitionEnd = curPartitionStart;
charsInCurPartition = 0;
}
}
return partitionLengths;
}
}