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.
Solution
Python3
class Solution:
def partitionLabels(self, s: str) -> List[int]:
n = len(s)
indices = {x: i for i, x in enumerate(s)}
i = 0
curr = set()
res = []
s += "!"
for j, x in enumerate(s):
if j == n or (j != 0 and len(curr) == 0):
res.append(j - i)
i = j
if j == n: break
curr.add(x)
if indices[x] == j:
curr.remove(x)
return res
C++
class Solution {
public:
vector<int> partitionLabels(string S) {
vector<int> res, pos(26, 0);
for (auto i = 0; i < S.size(); ++i){
pos[S[i] - 'a'] = i;
}
int maxIdx = INT_MIN, lastIdx = 0;
for (auto i = 0; i < S.size(); i++){
maxIdx = max(maxIdx, pos[S[i] - 'a']);
if (i == maxIdx){
res.push_back(maxIdx - lastIdx + 1);
lastIdx = i + 1;
}
}
return res;
}
};