同一字母分在同一子段,最多能分多少段
每个字母都向右扩展当前区间右端点,右端点不再扩展时子段结束、区间数++
vector<int> partitionLabels(string S) {
unordered_map<char, int> lastIdx;
for (int i = 0; i < S.size(); i++) {
lastIdx[S[i]] = i;
}
vector<int> ans;
// 每个字母都向右扩展当前区间右端点
int left = 0, right = -1;
for (int i = 0; i < S.size(); i++) {
right = max(right, lastIdx[S[i]]);
if (i == right) { // 右端点不再扩展时子段结束
ans.push_back(right - left + 1);
left = right + 1;
}
}
return ans;
}