字符串 S
由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入: S = "ababcbacadefegdehijhklij" 输出: [9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
存好开始位置和结束位置,然后合并区间即可
class Solution {
public:
vector<int> partitionLabels(string S) {
int size=S.size();
vector<int> start(26,-1);
vector<int> end(26,-1);
for(int i=0;i<size;i++)
{
if(start[S[i]-'a']<0)
{
start[S[i]-'a']=i;
}
end[S[i]-'a']=i;
}
map<int,int> region;
for(int i=0;i<26;i++)
{
if(start[i]<0) continue;
region[start[i]] = end[i];
}
map<int,int>::iterator it;
int start_pos=-1,end_pos=-1;
vector<int> result;
for(it=region.begin();it!=region.end();it++)
{
if (it->first > end_pos)
{
if (end_pos>=0)
{
result.push_back(end_pos-start_pos+1);
}
start_pos = it->first;
end_pos = it->second;
}
else
{
start_pos = min(start_pos,it->first);
end_pos = max(end_pos,it->second);
}
}
if(end_pos>=start_pos)
{
result.push_back(end_pos-start_pos+1);
}
return result;
}
};