题干:
代码:
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;
vector<int> res;
int left = 0;
int right = 0;
for(int i = 0; i < s.size(); i++){
right = max(right, hash[s[i] - 'a']);
if(i == right){
res.push_back(right - left + 1);
left = i + 1;
}
}
return res;
}
};
利用相对位置确定每个字母的最大位置边界,hash[s[i]-'a']=i是点睛之笔。然后不断更新最大右边界直到i到达最大右边界。
比方说:
输入:s = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca"、"defegde"、"hijhklij"
拿"ababcbaca"来说,{right = max(right, hash[s[i] - 'a']); if(i == right)}用a的最大右边界囊括了b 和 c。