解法一
class Solution {
public:
vector<int> partitionLabels(string S) {
vector<pair<int,int>> t(26,make_pair(-1,-1));
for(int i=0;i<S.size();i++){
t[S[i]-'a'].first==-1?t[S[i]-'a'].first = i:t[S[i]-'a'].first = min(t[S[i]-'a'].first, i);
t[S[i]-'a'].second = max(t[S[i]-'a'].second, i);
}
sort(t.begin(), t.end());
vector<pair<int,int>> res;
for(int i=0;i<t.size();i++){
if(t[i]==make_pair(-1,-1)) continue;
if(res.empty()){
res.push_back(t[i]);
continue;
}
if(res.back().second>=t[i].first)
res.back().second = max(res.back().second, t[i].second);
else
res.push_back(t[i]);
}
vector<int> r_res;
for(auto a:res){
r_res.push_back(a.second-a.first+1);
}
return r_res;
}
};
解法二 (目前最优)
class Solution {
public:
vector<int> partitionLabels(string S) {
if(S.empty()) return vector<int>{};
unordered_map<char, int> t;
for(int i=0;i<S.size();i++){
t[S[i]] = i;
}
vector<int> res;
int last = -1, start = 0;
for(int i=0;i<S.size();i++){
last = max(last, t[S[i]]);
if(i==last){
res.push_back(i-start+1);
start = i+1;
}
}
return res;
}
};