首先遍历字符串,记录每个字符出现的最后位置,然后重新遍历字符串,并不断更新有边界,当有边界等于 j 时,说明此时 j 前的字符在后面都不会在出现,在此处进行一次切割。
class Solution {
public:
vector<int> partitionLabels(string s) {
int last[26] = {0};
vector<int> result;
int left = 0;
int right = 0;
for(int i = 0; i < s.size(); i++){
last[s[i] - 'a'] = i;
}
for(int j = 0; j < s.size(); j++){
right = max(last[s[j] - 'a'], right);
if(right == j){
result.push_back(right - left + 1);
left = right + 1;
}
}
return result;
}
};