A string S
of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
Example 1:
Input: S = "ababcbacadefegdehijhklij" Output: [9,7,8] Explanation: The partition is "ababcbaca", "defegde", "hijhklij". This is a partition so that each letter appears in at most one part. A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts.
Note:
S
will have length in range[1, 500]
.S
will consist of lowercase letters ('a'
to'z'
) only.
public List<Integer> partitionLabels(String S) {
int sLength = S.length();
List<Character> tobeCheckedList = new ArrayList<>();
List<Character> restList = new ArrayList<>();
List<Character> entireList = new ArrayList<>(sLength);
for (char ch : S.toCharArray()) {
entireList.add(ch);
}
List<Character> assistantList = new ArrayList<>(sLength);
List<Integer> result = new ArrayList<>();
int step = 0;
for (int start = 0; start < sLength; start += step) {
int end = start;
while (end < entireList.size()) {
tobeCheckedList.clear();
tobeCheckedList.addAll(entireList.subList(start, end+1));
restList.clear();
restList.addAll(entireList.subList(end + 1, entireList.size()));
assistantList.clear();
assistantList.addAll(tobeCheckedList);
assistantList.retainAll(restList);
if (assistantList.size() > 0) {
end++;
} else {
List<Character> partitionList = entireList.subList(start, end + 1);
step = partitionList.size();
result.add(partitionList.size());
break;
}
}
}
return result;
}