LeetCode-763.划分字母区间(2020.10.22打卡题)

it2026-09-30  12

题目: 代码:

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中,并排序,再做一个减法即可得到正确答案

最新回复(0)