首先将出现的字母最后出现的下标存入end数组中,然后从头遍历,假设string中第一个字母结束位置为i,则遍历0到i,如果在此子串中出现的字母结尾位置j大于i,则更新i为j,一直遍历到子串中所有的字母都只出现在字串内,然后将该字串长度存入ans中,之后继续遍历。
例:S = “ababcbacadefegdehijhklij”
子串为"ababcbaca", “defegde”, “hijhklij”
ans = [9, 7, 8]
class Solution {
public:
vector<int> partitionLabels(string S) {
int len = S.size();
vector<int> end(26, 0);
for (int i = 0; i < len; ++i) {
end[S[i] - 'a'] = i;
}
int left = 0;
vector<int> ans;
while (left < len) {
int right = end[S[left] - 'a'];
for (int i = 0; i <= right; ++i) {
right = max(right, end[S[i] - 'a']);
}
ans.push_back(right - left + 1);
left = right + 1;
}
return ans;
}
};