给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。
思路:题目其实比较拗口,尽可能的多片段,还要让同一字母出现在一个片段里。
那么也就是说,在之前出现过的字母,至少要都出现完,并且保证后面都没有这个字母了。
做法:用数组映射记录每个字母出现的最大下标,然后再一次的遍历数组;直到下标到达当前遇到的最大值时,进行一次划分。
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[26]={0};
for(int i=0;i<s.size();i++)
{
hash[s[i]-'a']=i;//更新该字母出现过的最远下标
}
int left=0;
int right=0;
vector<int> result;
for(int i=0;i<s.size();i++)
{
right=max(right,hash[s[i]-'a']);
if(i==right)
{
result.push_back(i-left+1);
left=right+1;
}
}
return result;
}
};