一."ababcbacadefegdehijhklij" // [9,7,8] 划分为 "ababcbaca", "defegde", "hijhklij"
字符串 S
由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
二.思路
//1、用map记录每个字符最后出现的位置 res=[]输出的各个区间的长度
//2、start:最大区间的开头 end:最大区间的末尾 遍历字符串 更新end 每个遍历的元素最后出现的位置
//3、如果遍历到当前最大的区间位置 就说明这个区间是最大的 可以 push进去长度
//4、下一个start是这个end+1 直到把这个字符串遍历完
/**
* @param {string} S
* @return {number[]}
*/
var partitionLabels = function(S) {
let res=[];
let map = new Map();
let start=0;let end=0;
for(let i=0;i<S.length;i++){
map[S[i]]=i;
}
for(let j=0;j<S.length;j++){
end= Math.max(end,map[S[j]]);
if(end == j){
res.push(end - start+1);//如 2,3,4, 4-2+1=3个数
start = j+1;
}
}
return res;
};
三.知识点
贪心算法:找距离目标最近的拿,比如给钱问题,给6,最少拿几张:如果只有4、3、1,贪心:4+1+1 ,最优:3+3
拿每次遍历的元素和上次保存的end做比较 取最大