题目:
代码:
class Solution {
public:
vector<int> partitionLabels(string S) {
int begin[26],end[26];
for(int i=0;i<26;i++){
begin[i]=-1;
end[i]=-1;
}
for(int i=0;i<S.size();i++){
if(begin[S[i]-'a']==-1) {
begin[S[i]-'a']=i;
end[S[i]-'a']=i;
}
else end[S[i]-'a']=i;
}
vector<int> ans;
int flag[26];
for(int i=0;i<26;i++) flag[i]=1;
for(int i=0;i<26;i++){
if(flag[i]==1)
for(int j=i+1;j<26;j++){
if(flag[j]==1){
if((begin[i]<begin[j]&&end[i]>begin[j]||(begin[i]>begin[j]&&begin[i]<end[j]))){
begin[j]=min(begin[i],begin[j]);
end[j]=max(end[i],end[j]);
flag[i]=0;
break;
}
}
}
}
for(int i=0;i<26;i++){
if(flag[i]==1&&begin[i]!=-1) ans.push_back(begin[i]);
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size()-1;i++){
ans[i]=ans[i+1]-ans[i];
}
ans[ans.size()-1]=S.size()-ans[ans.size()-1];
return ans;
}
};
思路:先统计每个字母最先出现的位置和最后出现的位置,然后合并有交界的区间,即可将原字符划分为一个个不相交的区间,最后将每个区间的起始位置压入ans中,并排序,再做一个减法即可得到正确答案