题目描述
解题思路: 本来是想继续用区间排序来解决重叠问题,但不知为啥不对,实在等不及了看了题解。
补题:
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<vector<int> > local(26,vector<int>(2));//设置二维向量来存26个字母的起始
for(int i = 0; i < 26; ++i){
local[i][0] = 501;
}//初始化
for(int i = 0; i < s.size(); ++i){
int num = s[i]-'a';
if(local[num][0] == 501) local[num][0] = local[num][1] = i;
else local[num][1] = i;
}//遍历string取得区间值
sort(local.begin(), local.end(), [](vector<int>& a, vector<int>& b){
return a[0] < b[0];
});//排序
int start = local[0][0], end = local[0][1];
vector<int> ans;
for(int i = 1; i < 26; ++i){
if(local[i][0] == 501) break;//排除没有出现的字母
if(local[i][0] < end){
end = max(end, local[i][1]);
}//如果重叠,则扩大重叠长度
else{
ans.push_back(end - start +1);
start = local[i][0];
end = local[i][1];
}
}
ans.push_back(end - start +1);//跳出循环后需要将最后一次结果push
return ans;
};
};
解题思路:先记录每个字母最后出现的位置,然后再遍历一次string。如果遍历到一个字母的最后位置的过程中没有出现比他后面的就记录当前长度再来。
class Solution {
public:
vector<int> partitionLabels(string s) {
int local[26], end=0, start=0;
for(int i = 0; i < s.size(); ++i){
local[s[i]-'a'] = i;
}
vector<int> ans;
for(int i = 0; i < s.size(); ++i){
end = max(local[s[i]-'a'], end);
if(end == i){
ans.push_back(end - start +1);
start = i+1;
}
}
return ans;
}
};