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.
将字符串尽量多地分割,且相同的字母只能出现在一个部分,那么问题就转化为找分割点了.那么分割点有什么要求呢?就是小分段内的字母出现的最后位置,比如"ababcbaca" 最后为9.
class Solution {
public:
vector<int> partitionLabels(string S) {
map<char,int> last_map;
vector<int> res;
int start=0;
//记录分段末端序号
int last=0;
for(int i=0;i<S.size();i++)
{
//记录字符出现的最后序号;
last_map[S[i]]=i;
}
for(int i=0;i<S.size();i++)
{
if(last_map[S[i]]>last)
{
last=last_map[S[i]];
}
//已经没有更后的字符了
if(last == i)
{
res.push_back(i+1-start);
start=i+1;
}
}
return res;
}
};