给你一个字符串
s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是
s
。返回一个表示每个字符串片段的长度的列表。
示例 1:输入:s = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。示例 2:
输入:s = "eccbbbbdec" 输出:[10]提示:
1 <= s.length <= 500
s
仅由小写英文字母组成
思路:即每分段内的字母仅在该分段内出现,
- 1.找出各字母最终位置的下标
- 2.当该字母最终位置下标包含在分段内即对该字母分片完成
- 3.考虑多个字母时,即分段结尾应为分段内所有字母下标的最大值
class Solution {
public:
vector<int> partitionLabels(string s) {
int last[26];
for(int i=0;i<s.size();i++){
last[s[i]-'a']=i;
}//找出每个字母最终出现的下标
int start=0,end=0;
vector<int> p;
for(int i=0;i<s.size();i++){
end=max(end,last[s[i]-'a']);//end为该片段中字母最后出现的下表
if(i==end){//相等代表当前位置即所有字母都已出现,分段外无分段内字母出现
p.push_back(end-start+1);//记录长度
start=end+1;//更新起始点
}
}
return p;
}
};
参考:力扣