题目:
A string S of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
Example 1:
Input: S = “ababcbacadefegdehijhklij”
Output: [9,7,8]
其实和leetcode#56是异曲同工的:
Given a collection of intervals, merge all overlapping intervals.
leetcode56
对于本道题,每个字母都有一个出现范围区间,把重叠的区间合并就好。
贴出代码:
bool cmp(pair<int,int> a,pair<int,int> b)
{
return a.first<b.first;
}
vector<int> partitionLabels(string S)
{
vector<int> res;
vector<pair<int, int> > qj;
for (int i = 0; i < 26; i++)
{
int begin = -1, end = -1;
for (int j = 0; j < S.size(); j++)
{
if (S[j] == 'a' + i)
{
if (begin == -1)
begin = end = j;
else
end = j;
}
}
if (begin != -1)
{
qj.push_back(make_pair(begin, end));
}
}
sort(qj.begin(), qj.end(), cmp);
int begin = qj[0].first, end = qj[0].second, i = 1;
while (i < qj.size())
{
if (end >= qj[i].first)
end = max(end, qj[i].second);
else
{
res.push_back(end - begin + 1);
begin = qj[i].first;
end = qj[i].second;
}
i++;
}
res.push_back(end - begin + 1);
return res;
}