leetcode 763. 划分字母区间
问题描述: 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
思路: 创建一个数组,来记录每个词最后出现的位置,这个数组的下标对应26个字母的code值。 循环参数字符串,查找当前字母对应的最后出现的位置,若一致,则说明可以截断,重新设置start的位置为当前值+1,它用于在下一轮计算截断字符串长度。
/**
* @param {string} s
* @return {number[]}
*/
var partitionLabels = function(s) {
const ends=new Array(26).fill(0);
let base='a'.charCodeAt(0)
for(let i=0;i<s.length;i++){
ends[s.charCodeAt(i)-base]=i
}
let end=0,start=0;
let res=[];
for(let i=0;i<s.length;i++){
end=Math.max(ends[s.charCodeAt(i)-base],end);
if(end==i){
res.push(end-start+1);
start=end+1
}
}
return res
};