题目链接:https://leetcode-cn.com/problems/partition-labels/
贪心算法,维护cnt数组记录每个字母最后一次出现的位置,然后双指针遍历,一个指针遍历当前字母,另一个指针指向当前字母最后出现的位置,如果两指针相遇,说明这个part结束了。然后更新两指针新一轮的起始位置,直到遍历完字符串。
代码如下:
class Solution {
public:
vector<int> partitionLabels(string s) {
int len = s.size();
if(len == 1) { // 特判
return vector<int>{1};
}
int last[26] = {0};
for(int i = 0; i < len; i++) {
last[s[i] - 'a'] = i;
}
// for(int i = 0; i < 26; i++) {
// printf("last[%d] = %d\n", i, last[i]);
// }
vector<int> res;
for(int i = 0; i < len; i++) {
int begin = i; //记录当前 part 的起始位置
int j = last[s[i] - 'a']; //快指针初始化
if(i == j) { //特判,针对某字母只出现一次的情况
res.push_back(1);
continue;
}
while(1) {
if(last[s[i] - 'a'] > j) { //快指针更新
j = last[s[i] - 'a'];
}
i++;
//printf("i = %d, j = %d\n", i, j);
if(i == j) {
res.push_back(j - begin + 1);
i = j;
break;
}
}
}
return res;
}
};