题目描述
字符串
S
由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表
示例
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
思路
找到字符的最右边界,来划分字符串;
1.根据hash表,找到每个字符的最右边界;
2.再次遍历字符串,划分字符串
代码
class Solution {
public:
vector<int> partitionLabels(string s) {
//找到每个字符最右边的;
int hash[27];
int i;
int n=s.size();
//if(n<=0) return 0;
for(i=0;i<n;i++)
{
hash[s[i]-'a']=i;
}
vector<int> result;
int left=0;
int right=0;
for(i=0;i<n;i++)
{
right=max(right,hash[s[i]-'a']);
if(right==i)
{
result.push_back(right-left+1);
left=i+1;
}
}
return result;
}
};