一:题目:
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
二:思路:
思路:1.统计每个字母最后出现时候所对应的下标,
2.然后在遍历字符串,当 i 和该字母所对应的下标一样时,说明这是一个区间
三:图示:
四:上码:
class Solution {
public:vector<int> partitionLabels(string s) {/**思路:1.统计每个字母最后出现时候所对应的下标,2.然后在遍历字符串,当 i 和该字母所对应的下标一样时,说明这是一个区间*/map<char,int>m;//选取map容器是因为map的键值有自动去重功能,可以不断更新下标的位置vector<int>v;int start = 0,end = 0;//记录每个字母最后出现时候的下标for(int i = 0; i < s.size(); i++){m[s[i]] = i;}for(int i = 0; i < s.size(); i++){end = max(end,m[s[i]]);//这里每次选取每个区间内的字母对应的下标最大值if(end == i){v.push_back( end - start + 1);start = end+1;}}return v;}
};
加油 BOY!!!