leetcode 每日一题 763 划分字母区间

该博客介绍了LeetCode第763题的解决方案,即如何将一个字符串划分为尽可能多的片段,使得每个字母只出现在一个片段中。博主通过详细解释和示例说明了一种向后遍历的策略,并提出三种优化方案:利用Map存储已遍历字符、处理长度为1的片段以及处理最后一个片段。最后给出了优化后的代码实现。
摘要由CSDN通过智能技术生成

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

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

首先看到题目赶紧有点复杂,想了几种方法都感觉有点复杂。后来发现只需要一直向后遍历即可,当出现更大的 lastIndex 就更新一下,遍历到 lastIndex 为止。这就是一个片段,后面在 lastIndex 的下一位继续重复一直到字符串的末尾。

在这里插入图片描述
比如示例中:
1.起点为0;从 a 开始遍历,a 的 lastIndex 为8;temp 移到 b ,取得 b 的 lastIndex 为 5;temp 移到 a ,跳过 … temp 移到 c ,取得 c 的 lastIndex 为7;temp 移到 a ,temp==lastIndexlen=lastIndex-start+1添加 len 到答案。
2.起点为上一次的 lastIndex 下一位;从 d 开始遍历,d 的 lastIndex 为14;temp 移到 e ,取得 e 的 lastIndex 为15,大于原本的 lastIndex,更新其为15;… ;同上添加到答案。
3.起点为上一次的 lastIndex 下一位;从 h 开始遍历,h 的 lastIndex 为16;temp 移到 i,取得 i 的 lastIndex 为22,大于原本的 lastIndex ,更新为22;temp 移到 j,取得 j 的 lastIndex 为 23,大于原本的 lastIndex,更新为23;temp 移到 h,h 的 lastIndex 小于 lastIndex;temp 移动到 k,取得 k 的 lastIndex 为20;…;添加答案;

过程写的有些繁琐,看的都不耐烦了,所以里面有许多可以优化的地方嘛~
1.可以用一个 map 存储已经遍历过的字符,如果遍历过就不会再取该字符的 lastIndex 了;
2.如果有片段长度为1的字符,判断到的时候直接跳出后面的代码;
3.最后一个片段中,肯定会存在一个字符的 lastIndex 等于 S.length()-1,这个时候就可以直接添加该片段然后返回,避免后序多余的遍历。

然后可以得到代码如下:

class Solution {
   
    public List<Integer
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值