Last occurrence sweep
Time O(n) Space O(26)end = max(end, last[s[i]]); when i == end, close the part.
import java.util.*;
class Solution {
public List<Integer> partitionLabels(String s) {
int[] last = new int[26];
for (int i = 0; i < s.length(); i++) last[s.charAt(i) - 'a'] = i;
List<Integer> out = new ArrayList<>();
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
end = Math.max(end, last[s.charAt(i) - 'a']);
if (i == end) { out.add(end - start + 1); start = i + 1; }
}
return out;
}
}Verdict: Merging letter spans like intervals, in one pass.