题目描述:
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] Explanation: The partition is "ababcbaca", "defegde", "hijhklij". This is a partition so that each letter appears in at most one part. A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts.
Note:
S
will have length in range[1, 500]
.S
will consist of lowercase letters ('a'
to'z'
) only.
class Solution {
public:
vector<int> partitionLabels(string S) {
if(S.empty()) return {};
vector<pair<int,int>> v;
unordered_map<char,pair<int,int>> pos; // 统计每个字母下标的最大值和最小值
for(int i=0;i<S.size();i++)
{
if(pos.count(S[i])==0)
{
pos[S[i]].first=i;
pos[S[i]].second=i;
}
else
{
pos[S[i]].first=min(i,pos[S[i]].first);
pos[S[i]].second=max(i,pos[S[i]].second);
}
}
for(auto x:pos) v.push_back(x.second);
sort(v.begin(),v.end());
vector<pair<int,int>> merged;
pair<int,int> cur=v[0];
for(int i=1;i<v.size();i++)
{
if(intersect(cur,v[i]))
{
cur.first=min(cur.first,v[i].first);
cur.second=max(cur.second,v[i].second);
}
else
{
merged.push_back(cur);
cur=v[i];
}
}
merged.push_back(cur);
vector<int> result;
for(auto pos:merged) result.push_back(pos.second-pos.first+1);
return result;
}
bool intersect(const pair<int,int>& a, const pair<int,int>& b)
{
if(a.second<=b.first||a.first>=b.second) return false;
else return true;
}
};