输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。
题解
找出每个字符最后出现的位置,划分区间时设置开始位置start和结束位置end,然后比较每一次出现的字符的最后出现位置和end的大小,取最大值(取最大值是因为这个字符只能出现在一个片段中),直到比较的位置和end相同,说明划分出了一个片段,然后修改start和end,比较下一个区间
class Solution {
public:
vector<int> partitionLabels(string s) {
int last[26];
for(int i = 0; i < s.size(); i++)
last[s[i] - 'a'] = i;
int start = 0;
int end = 0;
vector<int> number;
for(int j = 0; j < s.size(); j++){
end = max(last[s[j] - 'a'], end);
if(j == end){
number.push_back(end -start + 1);
start = end + 1;
end = end + 1;
}
}
return number;
}
};