[路飞]leetcode-763.划分字母区间

83 阅读1分钟

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。力扣原文

 

示例:

输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

 

解题:

var partitionLabels = function (s) {
  // 记录每个字母出现的开始下标和结束下标
  const map = new Map();
  //遍历字符串
  for (let i = 0; i < s.length; i++) {
    if (map.has(s[i])) {
      // 更新下表
      map.get(s[i])[1] = i;
    } else {
      // 获取开始下标
      map.set(s[i], [i, i]);
    }
  }
  const result = [];
  // 记录开始区间、结束区间,称为待合并区间
  let start = 0,
    end = 0;
  map.forEach((item) => {
    // 获取当前字母的开始、结束下标
    const [cStart, cEnd] = item;
    // 对比当前字母的区间是否在待合并的区间内。
    //当前字母的区间的开始下标如果小于或等于待合并的结束下标,则合并,否则合并区间
    if (cStart <= end) {
      end = Math.max(end, cEnd);
    } else {
      result.push(end - start + 1);
      start = cStart;
      end = cEnd;
    }
  });
  //将最后的待合并区间的添加进结果
  result.push(end - start + 1);
  return result;
};