总体思路:贪心算法。先统计出每个字母出现的最后位置。之后遍历数组每个元素,并将迄今为止出现位置最后的位置保存在end中。直到恰好当前元素就是最后位置,此时记录一次结果res = begin - end + 1;begin = end + 1。
注意:因为遍历时会将每个元素最后位置比较并保留最大的,所以在end恰好等于i时,i之前的元素最后位置都在end前。
class Solution {
public:
vector<int> partitionLabels(string s) {
int lastAppear[26];
for (int i = 0; i < s.size(); i++) {
lastAppear[s[i] - 'a'] = i;
}
int begin = 0, end = 0;
vector<int> res;
for (int i = 0; i < s.size(); i++) {
end = max(end, lastAppear[s[i] - 'a']); //关键步骤
if (i == end) {
res.push_back(end - begin + 1);
begin = end + 1;
}
}
return res;
}
};