2
public List<String> maxNumOfSubstrings(String s) {8
BitSet[] bit = new BitSet[26];9
Arrays.setAll(bit, o -> new BitSet());10
for (int i = 0; i < n; i++) {11
R[s.charAt(i) - 'a'] = i; // last character index position13
for (int i = n - 1; i >= 0; i--) {14
L[s.charAt(i) - 'a'] = i; // first character index position16
for (int i = 0; i < 26; i++) { // add all characters between a character range.17
for (int j = L[i] + 1; j < R[i] && L[i] >= 0; j++) {18
bit[i].set(s.charAt(j) - 'a');22
while (go) { // keep merging until there is no more range change.24
for (int i = 0; i < 26; i++) {25
for (int j = bit[i].nextSetBit(0); j >= 0; j = bit[i].nextSetBit(j + 1)) {26
bit[i].or(bit[j]); // add all characters from character j to i.27
int l = Math.min(L[i], L[j]);28
int r = Math.max(R[i], R[j]);29
go |= l != L[i] || r != R[i];35
List<String> ans = new ArrayList<>();36
boolean[] seen = new boolean[n];37
for (int i = 0; i < 26; i++) { // populate the answer38
boolean ok = L[i] >= 0 && !seen[L[i]];39
for (int j = 0; j < 26 && ok; j++) {40
if (i != j && L[j] >= 0) { // only take those that has no smaller valid ranges.41
ok &= !(L[i] < L[j] && R[i] > R[j]);45
ans.add(s.substring(L[i], R[i] + 1));