763 划分字母区间

90 阅读1分钟

前言

今天我们来学习另外一道贪心算法的题目——划分字母区间。话不多说,直接看题目。

题目描述

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

示例:

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

S 的长度在[1, 500]之间。 S 只包含小写字母 'a' 到 'z' 。

题意理解

  1. 我们是要分割字符串
  2. 我们要实现,同一字母只能出现在同一个字串中

思路

  1. 我们要使同一个字母只能包含在同一个子串中,是不是应该找到该字母最后出现的位置呢?————当然是这样的
  2. 什么时候,我们应该去做切割操作呢?————当我们走到当前遍历的字串中的所有字母的最远最后出现位置时。

画图描述思路

20201222191924417 (1).png

伪代码(描述思路)

Function main(arr){
  Let result=[];
  Let lastIndexArr={}
  //记录字符串中字符出现现最后位置
  for(let i=0;i<arr.length;i++){
  lastIndexArr[arr[i]]=i
  }
  Let left=0,right= lastIndexArr[arr[0]];
  // 切割字符串,获取子串长度
  for(let i=0;i<arr.length;i++){
  if(i<right){
    right=Math.max(lastIndexArr[arr[i]],right);
  }else{
    result.push(right-left);
    left=i+1;
    right=lastIndexArr[arr[i+1]];
  }
  }
Return result;
}

总结

今天的算法题分享就到这里了,如有错误之处,欢迎大家留言指出,谢谢大家了。