0768 - Partition Labels
description
You are given a string s
. We want to partition the string into as many parts as possible so that each letter appears in at most one part. For example, the string "ababcc"
can be partitioned into ["abab", "cc"]
, but partitions such as ["aba", "bcc"]
or ["ab", "ab", "cc"]
are invalid.
Note that the partition is done so that after concatenating all the parts in order, the resultant string should be s
.
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.
Example 2:
Input: s = "eccbbbbdec" Output: [10]
Constraints:
1 <= s.length <= 500
s
consists of lowercase English letters.
submission
// we solve this by marking last occurrence of each char
// we just merge intervals on the way
impl Solution {
pub fn partition_labels(s: String) -> Vec<i32> {
// this should be right I think?
let last: std::collections::HashMap<char, usize> =
s.chars().enumerate().map(|(idx, ch)| (ch, idx)).collect();
let (mut start, mut end) = (0, 0);
let mut parts = vec![];
for (idx, ch) in s.chars().enumerate() {
// update the end index
if let Some(&idx) = last.get(&ch) {
end = end.max(idx)
}
// we've reached the end
if idx == end {
parts.push((end - start + 1) as i32);
start = idx + 1;
}
}
parts
}
}