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. Return a list of integers representing the size of these parts.
Greedy / Last Occurrence Map
To ensure a character appears in only one part, that part must extend at least to the character's last occurrence in the string. As we iterate, we maintain the `end` of the current partition, which is the maximum of the 'last occurrences' of all characters encountered so far. When the current index `i` catches up to `end`, we have found a valid partition.