news 2026/9/23 8:52:52

贪心题目:划分字母区间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贪心题目:划分字母区间

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:划分字母区间

出处:763. 划分字母区间

难度

4 级

题目描述

要求

给定字符串s \texttt{s}s。需要将这个字符串划分为尽可能多的片段,满足同一字母最多出现在一个片段中。

注意在将字符串划分成片段之后,所有片段拼接之后的结果应该是s \texttt{s}s

返回一个表示每个片段的长度的列表。

示例

示例 1:

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

示例 2:

输入:s = "eccbbbbdec" \texttt{s = "eccbbbbdec"}s = "eccbbbbdec"
输出:[10] \texttt{[10]}[10]

数据范围

  • 1 ≤ s.length ≤ 500 \texttt{1} \le \texttt{s.length} \le \texttt{500}1s.length500
  • s \texttt{s}s由小写英语字母组成

解法

思路和算法

为了确保相同字母最多出现在一个片段中,需要使用哈希表记录每个字母在字符串s ss中最后一次出现的下标。对于下标i ii处的字母c cc,将c cc最后一次出现的下标记为lastIndex \textit{lastIndex}lastIndex,则包含下标i ii的片段的结束下标一定大于等于lastIndex \textit{lastIndex}lastIndex,否则字母c cc会出现在多个片段中。在满足该条件的情况下,为了划分出尽可能多的片段,应使每个片段尽可能短,每个片段的结束下标尽可能小。这是一个贪心的策略。

得到每个字母在字符串s ss中最后一次出现的下标,从左到右遍历字符串s ss,遍历过程中维护当前片段的开始下标start \textit{start}start和结束下标end \textit{end}end。对于每个下标i ii,执行如下操作。

  1. c = s [ i ] c = s[i]c=s[i],得到字母c cc的最后一次出现的下标lastIndex \textit{lastIndex}lastIndex,则当前片段的结束下标一定大于等于lastIndex \textit{lastIndex}lastIndex,因此将end \textit{end}end更新为max ⁡ ( end , lastIndex ) \max(\textit{end}, \textit{lastIndex})max(end,lastIndex)

  2. 如果i = end i = \textit{end}i=end,则当前下标i ii为当前片段的结束下标,当前片段的下标范围是[ start , end ] [\textit{start}, \textit{end}][start,end],当前片段的长度是end − start + 1 \textit{end} - \textit{start} + 1endstart+1,将当前片段的长度添加到结果列表中,然后将start \textit{start}startend \textit{end}end都更新为i + 1 i + 1i+1,表示当前片段遍历结束,如果有下一个字母则下标i + 1 i + 1i+1为下一个片段的开始下标。

遍历结束之后,结果列表包含划分出的所有片段的长度。

上述贪心策略的正确性说明如下。

  1. 对于遍历到的每个字母,都将当前片段的下标范围扩展到包含当前字母的最后一次出现的下标,因此每个片段不可能更短,否则当前字母会出现在多个片段中。

  2. 遍历过程中遇到i = end i = \textit{end}i=end时,使用贪心策略,将i ii作为当前片段的结束下标,当i ii尚未到达字符串末尾时,将下标i + 1 i + 1i+1作为下一个片段的开始。如果不使用贪心策略,则不将下标i ii作为当前片段的结束下标,下一个片段的开始下标一定大于i + 1 i + 1i+1,字符串剩余部分的长度更少,因此不使用贪心策略可以划分出的片段数量不可能超过使用贪心策略可以划分出的片段数量。

代码

classSolution{publicList<Integer>partitionLabels(Strings){int[]lastIndices=newint[26];Arrays.fill(lastIndices,-1);intlength=s.length();for(inti=0;i<length;i++){charc=s.charAt(i);intindex=c-'a';lastIndices[index]=i;}List<Integer>partition=newArrayList<Integer>();intstart=0,end=0;for(inti=0;i<length;i++){charc=s.charAt(i);end=Math.max(end,lastIndices[c-'a']);if(i==end){partition.add(end-start+1);start=i+1;end=i+1;}}returnpartition;}}

复杂度分析

  • 时间复杂度:O ( n ) O(n)O(n),其中n nn是字符串s ss的长度。需要遍历字符串一次记录每个字母在字符串中最后一次出现的下标,然后需要遍历字符串一次计算划分结果。

  • 空间复杂度:O ( ∣ Σ ∣ ) O(|\Sigma|)O(∣Σ∣),其中Σ \SigmaΣ是字符集,这道题中Σ \SigmaΣ是全部小写英语字母,∣ Σ ∣ = 26 |\Sigma| = 26∣Σ∣=26。空间复杂度主要取决于哈希表,需要使用哈希表记录每个字母在字符串中最后一次出现的下标。注意返回值不计入空间复杂度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 8:52:52

面试被问游戏防沉迷怎么解除?3个核心考点搞定性能优化

面试被问游戏防沉迷怎么解除?3个核心考点搞定性能优化 面试时面试官突然甩出一句:“说说游戏防沉迷系统怎么解除限制?”,如果你支支吾吾答不上来,直接挂掉。这题看似简单,实则考察你对 性能优化 、高并发架构以及合规性边界的理解。别以为这是纯业务题,背后藏着分布式锁、缓存击穿、数据一致性等硬核考点。…

作者头像 李华
网站建设 2026/9/23 8:52:36

url地址怎么获取?3个实战案例拆解面试必问细节

url地址怎么获取?3个实战案例拆解面试必问细节 看了一堆教程还是不会写项目?别急着背八股文。很多学员在面试被问“url地址怎么获取”时,张口就是 window.location.href…

作者头像 李华
网站建设 2026/9/23 8:52:31

3天搞定如何做电子章,避开90%的踩坑点

3天搞定如何做电子章,避开90%的踩坑点 上周帮一个做基建项目的兄弟修Bug,他盯着屏幕抓狂: java.lang.NullPointerException 。报错日志拉出来有半页,全是红色的StackTrace,看得人脑仁疼。他问我:“我就想加个电子章,咋这么难?”…

作者头像 李华
网站建设 2026/9/23 8:52:19

3个坑搞懂flyleaf核心源码 面试原理不再卡壳

3个坑搞懂flyleaf核心源码 面试原理不再卡壳 面试被问原理答不上来,这种尴尬谁没经历过?特别是面对像 Flyleaf 这种相对小众但架构精巧的分布式组件,很多后端工程师只能背八股文,一问核心实现细节就哑火。今天咱们不整虚的,直接拆解 Flyleaf 的雪花算法实现, 一文搞懂 它如何解决…

作者头像 李华
网站建设 2026/9/23 8:52:16

5个技巧搞定tikitaka版本升级API变动最佳实践

5个技巧搞定tikitaka版本升级API变动最佳实践 刚把项目里的 tikitaka 库从 v1.2 升到 v2.0,结果一跑代码直接红屏,报错 AttributeError: module 'tikitaka' has no attribute 'init' 。这种 版本升级后 API 全变了…

作者头像 李华