[路飞]_js算法:leetcode 763-划分字母区间

91 阅读1分钟

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
};