题目链接
https://leetcode-cn.com/problems/partition-labels/
题目
字符串
S
由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
提示
S
的长度在[1, 500]
之间。S
只包含小写字母'a'
到'z'
。
思路
贪心法:首先第一次遍历字符串,得到每个字母最后一次出现的下标位置。然后进行第二次遍历,每次遍历到了某个字符,必然要把这个字符最后一次出现的下标位置前的所有元素放入整个子串(因为题目要求同一字母最多出现在一个片段中)。一直遍历并更新当前子串的最大下标位置,直到已经遍历到了当前子串的最大下标位置,这个子串便是使得同一字母仅出现在一个片段中的最小片段(也就能划分越多的分段),将当前子串长度加入到结果当中。
C++ Code
class Solution {
public:
vector<int> partitionLabels(string s) {
int last[26];
int n=s.size();
for(int i=0;i<n;i++)
{
last[s[i]-'a']=i;
}
int start=0,end=0;
vector<int> result;
for(int i=0;i<n;i++)
{
end=max(end,last[s[i]-'a']);
if(end==i)
{
result.push_back(end-start+1);
start=i+1;
}
}
return result;
}
};
结果