用哈希表存放每个字母出现的最后位置,然后从头到尾遍历字符,找到字符串片段的分割点。
需要注意的一点就是,不要把S.size()放到for循环里面去,提前把他算出来,直接用他的值,这样可以减少程序运行时间。因为for循环每执行一次,就会调用这个函数,造成了无谓的时间开销。
class Solution {
public:
vector<int> partitionLabels(string S) {
int hash[27]={0};
int len=S.size();
//不同i值代表对应的字母
for(int i=0;i<len;i++){
hash[S[i]-'a']=i; //记录每个字母出现的最后位置
}
vector<int> result;
int right=0,left=0;
for(int i=0;i<len;i++){
right=std::max(right,hash[S[i]-'a']);
if(right==i){
result.push_back(right-left+1);
left=i+1;
}
}
return result;
}
};